Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Hibernate在块中读/写blob数据_Java_Oracle_Hibernate_Stream_Blob - Fatal编程技术网

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();