2 回答
TA贡献1802条经验 获得超5个赞
使用CallableStatement.setBlob(int, InputStream)
或 Blob.setBinaryStream(long)
。这两种方法都可以使用InputStream
orOutputStream
对象并避免byte[]
在内存中创建数组。示例显示在将大对象类型对象添加到数据库文档中。
只要 JDBC 驱动程序足够智能,不会byte[]
在内部某处为整个 blob 创建,这就应该可以工作。
TA贡献1883条经验 获得超3个赞
可能是服务器配置过于严格。现在是检查内存参数的好时机。
只需提供InputStream即可填充 Blob 。
压缩 XML 数据也是一个好主意。尝试一下:将一些压缩test.xml为test.xml.gz,以获得大小增益。
注意标准java中存在:
private byte[] getBytesFromFile(Path path) throws IOException {
return Files.readAllBytes(path);
}
所以:
private void storeFileToDb(Connection connection, int fileId, String fileName,
String fileType) throws SQLException, IOException {
Path path = Paths.get(fileName); // Or parameter
try (CallableStatement callableStatement = connection.prepareCall(storedProcedure);
GZipInputStream fileIn = new GZipInputStream(Files.newBufferedInputStream(path))) {
...
callableStatement.setBlob(4, fileIn);
...
}
}
try-with-resources 确保在抛出异常或返回等情况下关闭。对语句也很有用。
您没有关闭语句,里面有一个 Blob。这是不可取的,因为数据可能会停留一段时间。CallableStatement 也是 PreparedStatement,其中一个用例使用可能的其他参数值重复执行 SQL。或不。
并用于解压GZipOutputStream。
添加回答
举报