【问题标题】:how to insert a huge file to BLOB (Oracle) without loading the complete file to memory?如何在不将完整文件加载到内存的情况下将大文件插入 BLOB (Oracle)?
【发布时间】:2014-09-15 10:16:46
【问题描述】:

我们的临时文件系统上存储了一个大文件,我需要使用 BufferedInputStream 读取那个大文件(可能是几个或几个 gig),如下所示

InputStream is = is = new BufferedInputStream(new FileInputStream(file));

这将有效地减少读取文件的时间并希望将文件保存到 DB (Oracle) 中的 BLOB。

这是真正的问题:

我不希望文件被完全读取到我的内存中,因为我正在进入内存不足并且想要读取块并将文件内容作为字节数组推送到我的 DB BLOB 列。

基本上,我的想法是消除将完整文件加载到内存并实现将文件保存到 BLOB 的开销(可能会附加到现有的 BLOB 内容左右)

有什么方法可以实现吗?

PS:我们使用 Hibernates 来保存 BLOB 文件

【问题讨论】:

  • 为什么要在数据库中存储这么大的文件?
  • 使用preparedStatement.setBlob(int parameterIndex, InputStream inputStream)只需要提供输入流,不需要读入文件到mem
  • 在 Hibernate 世界中有什么相关的吗? Bcoz 我不想归结为 Prepared Statement 级别来测试它是否有效。

标签: java oracle hibernate jakarta-ee blob


【解决方案1】:

对于那些在那里的人......

这是完成它的过程:

stmt.execute ("INSERT INTO my_blob_table VALUES ('row1', empty_blob())");
BLOB blob;
cmd = "SELECT * FROM my_blob_table WHERE X='row1' FOR UPDATE";
ResultSet rset = stmt.executeQuery(cmd);
rset.next();
BLOB blob = ((OracleResultSet)rset).getBLOB(2);
File binaryFile = new File("john.gif");
System.out.println("john.gif length = " + binaryFile.length());
FileInputStream instream = new FileInputStream(binaryFile);
OutputStream outstream = blob.setBinaryStream(1L);
int size = blob.getBufferSize();
byte[] buffer = new byte[size];
int length = -1;

来源:http://docs.oracle.com/cd/B19306_01/java.102/b14355/oralob.htm#CHDFHHHG

【讨论】:

    【解决方案2】:

    不使用休眠选项吗?

    您可以使用 UTL_FILE 从文件中读取数据

    http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003849

    和 DBMS_LOB 写入一个 LOB

    http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_lob.htm#i999705

    通过分块读取/写入,您可以避免在任何时候将整个 blob 放在内存中。

    为了使 UTL_FILE 工作,数据库确实需要能够从文件系统中读取文件(即包含该文件的文件系统必须可供数据库服务器访问)。如果文件可用于 HTTP/FTP 等,您还可以从 HTTP 流或 TCP 数据流中读取。

    【讨论】:

    • hmmm 如果我可以使用 DB 过程来做到这一点,那就太好了。我可以为这些东西编写一些代码,但对 DBMS_LOB.WRITEAPPEND 有点担心,更多关于参数 lob_loc 我应该传递什么。我需要再次从 Hibernate 跳回纯 SQL/PLSQL 领域来实现这一点。
    猜你喜欢
    • 1970-01-01
    • 2011-10-15
    • 2014-12-13
    • 1970-01-01
    • 1970-01-01
    • 2013-07-07
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多