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

Att*_*cus 8 java oracle hibernate blob stream

有没有办法从blob块中读取和写入使用Hibernate.现在我得到了OutOfmemoryException因为整个blob数据被加载到内存中byte[].

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

public class File {
   private byte[] data;
}
Run Code Online (Sandbox Code Playgroud)

我在FileInputStream中打开文件然后呢?我如何告诉Hibernate我需要流式传输内容并且不会立即提供整个byte[]数组?我应该用Blob而不是byte[]吗?无论如何我如何流式传输内容?

关于读书,有没有办法,我可以告诉Hibernate是(除了延迟加载它)我需要大块要加载的斑点,所以当我取回我File不应该给我OutOfMemoryException.

我在用:

  • Oracle 11.2.0.3.0
  • Hibernate 4.2.3 Final
  • Oracle Driver 11.2

Roy*_*Six 13

如果进入Blob路由,您是否尝试过使用Hibernate的LobHelper createBlob方法,这需要一个InputStream?要创建Blob并持久保存到数据库,您将提供FileInputStream对象和字节数.

您的File bean/entity类可以像这样映射Blob(使用JPA注释):

@Lob
@Column(name = "DATA")
private Blob data;

// Getter and setter
Run Code Online (Sandbox Code Playgroud)

业务逻辑/数据访问类可以像这样为您的bean /实体对象创建Blob,注意不要在持久化到数据库之前关闭输入流:

FileInputStream fis = new FileInputStream(file);
Blob data = getSession().getLobHelper().createBlob(fis, file.length());
fileEntity.setData(data);
// Persist file entity object to database
Run Code Online (Sandbox Code Playgroud)

要以另一种方式从数据库中读取Blob作为块中的流,您可以调用Blob的getBinaryStream方法,为您提供InputStream并允许您在以后需要时设置缓冲区大小:

InputStream is = fileEntity.getData().getBinaryStream();
Run Code Online (Sandbox Code Playgroud)

Struts 2 有一个方便的配置,可以设置InputStream结果的缓冲区大小.