Когда я выполняю поиск в Интернете для вставки больших двоичных объектов в базу данных 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, размер большого двоичного объекта, ...)? Первое решение лучше (скорость, потребление памяти, ...)? Какие-либо причины не использовать более простой второй подход?
Точно такой же вопрос относится к полям CLOB.