Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.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 休眠-内存不足,插入大blob_Java_Hibernate_Insert_Blob - Fatal编程技术网

Java 休眠-内存不足,插入大blob

Java 休眠-内存不足,插入大blob,java,hibernate,insert,blob,Java,Hibernate,Insert,Blob,在POJO,我有: public void setBlob(InputStream in, Long l) { this.blob = Hibernate.getLobCreator(SessionFactoryHelper.sessionFactory.getCurrentSession()).createBlob(in, l); } 我在配置中将hibernate.jdbc.use_streams_for_binary设置为true,但它真的改变了什么吗 保存实体时,在se

在POJO,我有:

public void setBlob(InputStream in, Long l) {
        this.blob = Hibernate.getLobCreator(SessionFactoryHelper.sessionFactory.getCurrentSession()).createBlob(in, l);
}
我在配置中将hibernate.jdbc.use_streams_for_binary设置为true,但它真的改变了什么吗

保存实体时,在session.flush()上,我得到:

休眠4.1。
为什么要冬眠,把包裹着的溪流打开?如何使hibernate使用prepared语句setBinaryStream?我真的需要这方面的帮助。

我不知道为什么它不工作,它应该工作,但我使用Hibernate将blob保存到数据库中所做的工作如下:

在映射到表的POJO中:

    private byte[] serializedDocx; // + getter and setter
在一种方法中:

    ...
     SessionFactory mf = ...
     sess = mf.openSession();
     //open connection
     sess.beginTransaction();
    ...
      ByteArrayOutputStream docxBos = new ByteArrayOutputStream();
      [write to docxBos]
      someEntity.setDocx(docxBos.toByteArray());
      sess.save(someEntity);
在myEntity.hbm.xml中

  <property name="serializedDocx" type="binary">
      <column name="serialized_docx" not-null="true"/>
    </property>

HTH.

我认为问题在于内存中的对象仍然填充了字节数组。 这与是否使用流将其持久化到数据库是一个单独的问题

我建议一个解决办法:不要将水滴存储在POJO中。 将blob单独存储在数据库中(通过直接JDBC)或磁盘上,然后在POJO中保留对blob的引用(数据库主键或磁盘路径/文件名)

然后,当需要返回blob时,从POJO获取引用并使用基于流的方法将其返回


每次需要获取/保存blob时需要做更多的工作,但是如果blob太大而无法存储,您可能没有其他选择。

谢谢您的回复。我试图保存的blob是1gb文件,内存有限。我无法调用toByteArray()。是否可以让hibernate使用准备好的语句
setBinaryStream(int-parameterIndex,java.io.InputStream x)
???
  <property name="serializedDocx" type="binary">
      <column name="serialized_docx" not-null="true"/>
    </property>
CREATE TABLE IF NOT EXISTS `docx` (
  `serialized_docx` longblob NOT NULL, ...