Когда я поиск в Интернете для вставки BLOB-в базу данных Oracle с JDBC тонкого драйвера, большинство веб-страниц предлагаем 3-ступенчатый подход:усложненной Oracle JDBC обработка BLOB
- вставки
empty_blob()
значение. - выберите строку с номером
for update
. - Вставить реальное значение.
Это прекрасно работает для меня, вот пример:
Connection oracleConnection = ...
byte[] testArray = ...
PreparedStatement ps = oracleConnection.prepareStatement(
"insert into test (id, blobfield) values(?, empty_blob())");
ps.setInt(1, 100);
ps.executeUpdate();
ps.close();
ps = oracleConnection.prepareStatement(
"select blobfield from test where id = ? for update");
ps.setInt(1, 100);
OracleResultSet rs = (OracleResultSet) ps.executeQuery();
if (rs.next()) {
BLOB blob = (BLOB) rs.getBLOB(1);
OutputStream outputStream = blob.setBinaryStream(0L);
InputStream inputStream = new ByteArrayInputStream(testArray);
byte[] buffer = new byte[blob.getBufferSize()];
int byteread = 0;
while ((byteread = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, byteread);
}
outputStream.close();
inputStream.close();
}
Есть некоторые веб-страницы, в которых авторы предлагают использовать более простой 1 шаг решение. Предыдущий пример с этим решением:
Connection oracleConnection = ...
byte[] testArray = ...
PreparedStatement ps = oracleConnection.prepareStatement(
"insert into test(id, blobfield) values(?, ?)");
BLOB blob = BLOB.createTemporary(oracleConnection, false, BLOB.DURATION_SESSION);
OutputStream outputStream = blob.setBinaryStream(0L);
InputStream inputStream = new ByteArrayInputStream(testArray);
byte[] buffer = new byte[blob.getBufferSize()];
int byteread = 0;
while ((byteread = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, byteread);
}
outputStream.close();
inputStream.close();
ps.setInt(1, 100);
ps.setBlob(2, blob);
ps.executeUpdate();
ps.close();
Второй код гораздо проще, поэтому мой вопрос: Что такое точка первого (популярного) решения? Есть ли (было) какое-то ограничение для второго решения (номер версии сервера Oracle, версия драйвера jdbc, размер blob, ...)? Лучше ли первое решение (скорость, потребление памяти, ...)? Любые причины не использования более простого второго подхода?
Тот же вопрос применяется к полям CLOB.
Является ли агрегирование базы данных "FOR UPDATE"? Например, он не работает в SQL Server. Но, возможно, это вообще не важно для вышеупомянутой техники ... –
Предложение FOR UPDATE инструктирует базу данных блокировать строки. Это важно в этом случае, потому что набор результатов будет обновлять эти строки. Если вы уверены, что никто не будет обновлять эти строки, вам может не понадобиться блокировка. –
Вы не вставляете BLOB здесь, вы просто обновляете его. ОП был конкретно о вставке. –