如何在不将完整文件加载到内存的情况下将大文件插入BLOB(Oracle)?

时间:2014-07-24 01:52:09

标签: java oracle hibernate java-ee blob

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

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

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

这是真正的问题:

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

基本上,我的想法是终止将整个文件加载到内存并实现将文件保存到BLOB(可能附加到现有的BLOB内容等)

有没有办法实现这一目标?

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

2 个答案:

答案 0 :(得分:2)

对那些人来说......

以下是完成工作的过程:

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

答案 1 :(得分:1)

是不是在使用Hibernate?

您可以使用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数据流中读取。