Когда я просматриваю веб-страницы для вставки BLOB файлов в базу данных Oracle с помощью тонкого драйвера jdbc, большинство веб-страниц предлагают трехэтапный подход:
- Вставить
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();
}
Есть несколько веб-страниц, в которых авторы предлагают использовать более простое одношаговое решение. Предыдущий пример с этим решением:
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.