Отсутствующие символы взяты из Boost.Regex, который используется Boost.Log (точнее, boost_log_setup
ссылается на свои символы внутри). Вам необходимо добавить Boost.Regex в список библиотек для связи. Учитывая ваши сообщения об ошибках, это должно быть libboost_regex-vc141-mt-gd-x64-1_69.lib
для вашей статической компоновки.
Подход к обновлению, который вы упомянули в первом случае, можно переписать с использованием чистого кода JDBC и, таким образом, уменьшить вашу зависимость от классов, специфичных для Oracle. Это может быть полезно, если ваше приложение должно быть независимым от базы данных.
public static void updateBlobColumn(Connection con, String table, String blobColumn, byte[] inputBytes, String idColumn, Long id) throws SQLException {
PreparedStatement pStmt = null;
ResultSet rs = null;
try {
String sql =
" SELECT " + blobColumn +
" FROM " + table +
" WHERE " + idColumn + " = ? " +
" FOR UPDATE";
pStmt = con.prepareStatement(sql,
ResultSet.TYPE_FORWARD_ONLY,
ResultSet.CONCUR_UPDATABLE);
pStmt.setLong(1, id);
rs = pStmt.executeQuery();
if (rs.next()) {
Blob blob = rs.getBlob(blobColumn);
blob.truncate(0);
blob.setBytes(1, inputBytes);
rs.updateBlob(blobColumn, blob);
rs.updateRow();
}
}
finally {
if(rs != null) rs.close();
if(pStmt != null) pStmt.close();
}
}
Для MSSQL я понимаю, что синтаксис блокировки отличается:
String sql =
" SELECT " + blobColumn +
" FROM " + table + " WITH (rowlock, updlock) " +
" WHERE " + idColumn + " = ? "
Одна интересная особенность JDBC заключается в том, что вы можете довольно агрессивно обновляться до последних версий драйверов и работать с функциями JDBC 4.0. Драйверы Oracle JDBC будут работать со старыми версиями баз данных, поэтому вы можете использовать фирменный драйвер JDBC 11g для базы данных 10g. База данных Oracle 11g JDBC поставляется в двух вариантах: ojdbc5.jar для Java 5 (например, JDK 1.5) и ojdbc6.jar для Java 6 (например, JDK 1.6). Ojdbc6.jar поддерживает новую спецификацию JDBC 4.0.
С новыми драйверами / jdbc 4.0 вы можете создавать Blobs и Clobs из объекта подключения:
Blob aBlob = con.createBlob();
int numWritten = aBlob.setBytes(1, val);
Сервер Oracle обрабатывает большие объекты довольно плохо и может иметь серьезные проблемы с производительностью (например, массовое чрезмерное использование журнала повторов), поэтому первое решение может быть способом их решения.
Я предлагаю попробовать оба подхода. если у вас есть компетентный администратор баз данных, они могут посоветовать, какой подход имеет наименьшее влияние на сервер.
Это утверждение:
blob.setBytes(1, inputBytes);
вызывает проблемы, когда я использую тонкий клиент Oracle ojdbc14.jar, «Неподдерживаемые функции»
Итак, мне пришлось обойтись следующим образом:
rset.next();
Blob bobj = rset.getBlob(1);
BLOB object = (BLOB) bobj;
int chunkSize = object.getChunkSize();
byte[] binaryBuffer = new byte[chunkSize];
int position = 1;
int bytesRead = 0;
int bytesWritten = 0, totbytesRead = 0, totbytesWritten = 0;
InputStream is = fileItem.getInputStream();
while ((bytesRead = is.read(binaryBuffer)) != -1) {
bytesWritten = object.putBytes(position, binaryBuffer, bytesRead);
position += bytesRead;
totbytesRead += bytesRead;
totbytesWritten += bytesWritten;
is.close();