gpt4 book ai didi

java - 如何使用 Blob 对象将大型原始 XML 文件写入 Oracle 数据库?

转载 作者:行者123 更新时间:2023-11-30 01:48:19 27 4
gpt4 key购买 nike

我有一个函数,可以使用 FileInputStream 将大型 XML 文件转换为字节数组。它在我的 IDE 中运行良好,但当通过可执行文件独立运行时,它会在线程“main”java.lang.OutOfMemoryError:Java堆空间中抛出异常。我正在字节数组中读取这个大文件,以将其作为 Blob 存储在目标数据库中。我无法控制 Blob 的存储方式,我只能访问存储过程来插入 Blob。有没有一种方法可以读取和写入数据 block 而不将整个文件加载到内存中?

将文件转换为字节数组的函数 -

private byte[] getBytesFromFile(Path path) throws IOException {
FileInputStream fis = new FileInputStream(path.toFile());
byte[] bytes = new byte[(int) path.toFile().length()];
int read = 0;
int offset = 0;
while(offset < bytes.length && (read = fis.read(bytes, offset, bytes.length - offset)) >= 0 ){
offset += read;
}
fis.close();
return bytes;
}

这是使用存储过程调用将字节数组存储到数据库的代码

private void storeFileToDb(Connection connection, int fileId, String fileName, String fileType, byte[] fileBytes) throws SQLException {
//
String storedProcedure = "{call SP(?,?,?,?,?) }";
CallableStatement callableStatement = connection.prepareCall(storedProcedure);
callableStatement.setInt(1, fileId);
callableStatement.setString(2, fileName);
callableStatement.setString(3, fileType);
Blob fileBlob = connection.createBlob();
fileBlob.setBytes(1, fileBytes);
callableStatement.setBlob(4, fileBlob);
callableStatement.registerOutParameter(5, OracleTypes.NUMBER);
callableStatement.execute();
fileBlob.free(); // not entirely sure how this helps
//callableStatement.close();
}

最佳答案

使用 CallableStatement.setBlob(int, InputStream)Blob.setBinaryStream(long) 。这两种方法都可以使用 InputStreamOutputStream 对象,并避免在内存中创建 byte[] 数组。示例显示于 Adding Large Object Type Object to Database docs .

只要 JDBC 驱动程序足够聪明,不会在内部某处为整个 blob 创建 byte[],这应该就可以工作。

关于java - 如何使用 Blob 对象将大型原始 XML 文件写入 Oracle 数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57008714/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com