使用Hibernate以块形式读取/写入blob数据



有没有一种方法可以使用Hibernate以块的形式从blob读取和写入。现在我得到的是OutOfmemoryException,因为整个blob数据都在内存中加载到了byte[]中。

更具体地说,假设我想将一个大文件保存到一个名为File的数据库表中。

public class File {
   private byte[] data;
}

我在FileInputStream中打开文件,然后呢?我如何告诉Hibernate我需要流式传输内容,并且不会一次给出整个byte[]数组?我应该使用Blob而不是byte[]吗?无论如何,我怎样才能流式传输内容?

关于阅读,有没有一种方法可以告诉hibernate(除了延迟加载之外)我需要将blob分块加载,所以当我检索File时,它不应该给我OutOfMemoryException

我正在使用:

  • Oracle 11.2.0.3.0
  • 休眠4.2.3期末考试
  • Oracle驱动程序11.2

如果使用Blob路由,您是否尝试过使用Hibernate的LobHelpercreateBlob方法,该方法需要InputStream?要创建Blob并持久保存到数据库,您需要提供FileInputStream对象和字节数。

Filebean/entity类可以像这样映射Blob(使用JPA注释):

@Lob
@Column(name = "DATA")
private Blob data;
// Getter and setter

业务逻辑/数据访问类可以像这样为您的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的getBinaryStream方法,为您提供InputStream,并允许您稍后根据需要设置缓冲区大小:

InputStream is = fileEntity.getData().getBinaryStream();

Struts2提供了一个方便的配置,可以设置InputStream结果的缓冲区大小。

相关内容

  • 没有找到相关文章

最新更新