如何在不将完整文件加载到内存的情况下将大文件插入BLOB(Oracle)?
我们在临时文件系统上存储了一个大文件,我需要的是使用BufferedInputStream读取那个巨大的文件(可能是几个或几个演出),如下所示
InputStream is = is = new BufferedInputStream(new FileInputStream(file));
这将有效地减少读取文件的时间,并希望将文件保存到DB(Oracle)中的BLOB。
这是真正的问题:
我不希望文件被完全读入我的内存,因为我登陆内存不足并想要读取块并将文件内容作为字节数组推送到我的DB BLOB列。
基本上,我的想法是杀死将完整文件加载到内存并实现将文件保存到BLOB(可能附加到现有BLOB内容等)的头顶
有没有办法实现这一目标?
PS:我们使用Hibernates来保存BLOB文件
对那些人来说……
这是完成它的过程:
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
是不是使用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数据流中读取。
- 使用java websocket API和Javascript上传文件
- Java:从Oracle读取Blob
- 在没有光标的Android Sqlite中访问大型BLOB
- 将Blob存储在Heroku(或类似的云服务)中
- 用于从Java中的blob内容创建文件的代码段
- 如何在java中将Blob转换为String和String转换为Blob
- 如何用JSON表示数据库中的图像
- java.lang.AbstractMethodError:com.mysql.jdbc.PreparedStatement.setBlob(ILjava / io / InputStream;)V
- 从数据库中读取BLOB(PDF内容)并编辑和输出PDF编辑的文件,而无需创建物理文件