在JDBC中将blob插入oracle的最佳方法是什么?

时间:2019-03-05 13:45:54

标签: oracle jdbc blob

我有一个Java代码,应该将字节数组插入Oracle数据库到blob列中。 函数签名为:

void loadBlob(Connection connection, byte[] byteData, PreparedStatement ps) {...}

字节数组作为参数传递(无需从任何源/流中读取)。

ps使用以下方法创建:

connection.prepareStatement("insert into mytable values(?)")

mytable脚本为:create table mytable (myblob blob)

加载blob的方法有很多:

  1. 使用标准的jdbc Blob对象
Blob blob = connection.createBlob();
blob.setBytes(1, byteData);
ps.setBlob(1, blob);
ps.execute();
blob.free();
  1. 使用oracle的特定对象
Blob blob = BLOB.createTemporary(connection, false, BLOB.DURATION_SESSION);
blob.setBytes(1, byteData);
ps.setBlob(1, blob);
ps.execute();
blob.free();
  1. 使用oracle的数据库函数hextoraw
PreparedStatement ps2 = connection.prepareStatement("insert into mytable values (hextoraw(?))")
//convert the byte array to hexadecimal digits - the implementation is skipped to avoid de-focus from the main issue
String hexaDigits = convertByteArrayToHexaDigits(byteData);
ps2.setString(1, hexaDigits);
ps2.execute();

问题

上述方式的优点/缺点是什么? 还有其他更好的方法吗?

2 个答案:

答案 0 :(得分:0)

您的第一个和第二个示例似乎与我相同:

blob.setBytes(1, byteData);
ps.setBlob(1, blob);
ps.execute();
blob.free();

在您的第三个示例中,我可能会选择此方法。这样做的原因是第三个示例涉及调用Oracle函数hextoraw。这可能会在插入过程中产生额外的开销,因此可能不如选项1或2那样好。

答案 1 :(得分:0)

我所知的最好方式:

ps.setBytes( 1, byteData );

HTH Loïc