2 回答

TA貢獻1802條經驗 獲得超5個贊
使用CallableStatement.setBlob(int, InputStream)
或 Blob.setBinaryStream(long)
。這兩種方法都可以使用InputStream
orOutputStream
對象并避免byte[]
在內存中創建數組。示例顯示在將大對象類型對象添加到數據庫文檔中。
只要 JDBC 驅動程序足夠智能,不會byte[]
在內部某處為整個 blob 創建,這就應該可以工作。

TA貢獻1883條經驗 獲得超3個贊
可能是服務器配置過于嚴格?,F在是檢查內存參數的好時機。
只需提供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 確保在拋出異?;蚍祷氐惹闆r下關閉。對語句也很有用。
您沒有關閉語句,里面有一個 Blob。這是不可取的,因為數據可能會停留一段時間。CallableStatement 也是 PreparedStatement,其中一個用例使用可能的其他參數值重復執行 SQL?;虿?。
并用于解壓GZipOutputStream。
添加回答
舉報