过于复杂的 oracle jdbc BLOB handling
当我使用jdbc精简驱动程序搜索将BLOB插入Oracle数据库时,大多数网页都建议采用3步方法:
- 插入值。
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 字段。