Java 使用Hibernate在块中读/写blob数据
是否有一种方法可以使用Java 使用Hibernate在块中读/写blob数据,java,oracle,hibernate,stream,blob,Java,Oracle,Hibernate,Stream,Blob,是否有一种方法可以使用Hibernate对blob进行分块读写。 现在我得到的是OutOfmemoryException,因为整个blob数据都加载到内存中的字节[] 更具体地说,假设我想将一个大文件保存到名为file的数据库表中 public class File { private byte[] data; } 我在FileInputStream中打开文件,然后呢? 如何告诉Hibernate我需要流式传输内容,而不会一次给出整个字节[]数组? 我应该使用Blob而不是byte[]?
Hibernate
对blob
进行分块读写。
现在我得到的是OutOfmemoryException
,因为整个blob数据都加载到内存中的字节[]
更具体地说,假设我想将一个大文件保存到名为file
的数据库表中
public class File {
private byte[] data;
}
我在FileInputStream中打开文件,然后呢?
如何告诉Hibernate我需要流式传输内容,而不会一次给出整个字节[]
数组?
我应该使用Blob
而不是byte[]
?无论如何,我怎样才能流式传输内容
关于阅读,是否有一种方法可以告诉hibernate(除了延迟加载之外),我需要将blob分块加载,因此当我检索文件时,它不应该给我OutOfMemoryException
我正在使用:
- Oracle 11.2.0.3.0
- Hibernate 4.2.3最终版本
- Oracle驱动程序11.2
如果选择Blob路径,您是否尝试过使用Hibernate的LobHelper
方法,该方法采用InputStream
?要创建Blob并持久化到数据库,您需要提供FileInputStream对象和字节数
您的文件bean/实体类可以像这样映射Blob(使用JPA注释):
业务逻辑/数据访问类可以像这样为bean/实体对象创建Blob,注意在持久化到数据库之前不要关闭输入流:
FileInputStream fis = new FileInputStream(file);
Blob data = getSession().getLobHelper().createBlob(fis, file.length());
fileEntity.setData(data);
// Persist file entity object to database
要以另一种方式从数据库中以块的形式读取Blob,可以调用Blob的方法,为您提供InputStream,并允许您在以后需要时设置缓冲区大小:
InputStream is = fileEntity.getData().getBinaryStream();
Struts 2.我如何在hbm.xml中定义@Lob(我们在hbm.xml文件中定义域对象)?我相信@Lob注释是可选的,只要您声明是type=“blob”谁将关闭该流?我相信Hibernate在插入完成后关闭blob的流。Hibernate使用其内部类。如果您调试并单步执行代码,您可以观察代理blob的输入流,最终会得到一个关闭值true
(插入完成后)。但在刷新会话/事务完成后,您自己关闭流可能是一个好做法,因为它没有在LobHelper
接口的合约中定义。@RoySix您知道Blob对象是否包含所有内容并流回到客户端代码,还是从数据库流出来?
InputStream is = fileEntity.getData().getBinaryStream();