Сверхсложный оракул jdbc обработка BLOB

Отсутствующие символы взяты из Boost.Regex, который используется Boost.Log (точнее, boost_log_setup ссылается на свои символы внутри). Вам необходимо добавить Boost.Regex в список библиотек для связи. Учитывая ваши сообщения об ошибках, это должно быть libboost_regex-vc141-mt-gd-x64-1_69.lib для вашей статической компоновки.

31
задан asalamon74 14 May 2009 в 09:15
поделиться

4 ответа

Подход к обновлению, который вы упомянули в первом случае, можно переписать с использованием чистого кода 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 + " = ? "
11
ответ дан 27 November 2019 в 22:39
поделиться

Одна интересная особенность 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);
5
ответ дан 27 November 2019 в 22:39
поделиться

Сервер Oracle обрабатывает большие объекты довольно плохо и может иметь серьезные проблемы с производительностью (например, массовое чрезмерное использование журнала повторов), поэтому первое решение может быть способом их решения.

Я предлагаю попробовать оба подхода. если у вас есть компетентный администратор баз данных, они могут посоветовать, какой подход имеет наименьшее влияние на сервер.

5
ответ дан 27 November 2019 в 22:39
поделиться

Это утверждение:

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();
4
ответ дан 27 November 2019 в 22:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: