2012-03-07 4 views
4

を挿入するメモリ不足私が持っている:休止 - POJOで大きなブロブ

public void setBlob(InputStream in, Long l) { 
     this.blob = Hibernate.getLobCreator(SessionFactoryHelper.sessionFactory.getCurrentSession()).createBlob(in, l); 
} 

は私がconfigにhibernate.jdbc.use_streams_for_binaryを真作られたが、それは本当に何かを変更しますか?

session.flushに、エンティティを保存()私が手:

org.hibernate.engine.jdbc.batch.internal.AbstractBatchImpl release 
INFO: HHH000010: On release of batch it still contained JDBC statements 
Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space 
Heap dump file created [46180174 bytes in 1.662 secs] 
    at java.util.Arrays.copyOf(Arrays.java:2271) 
    at java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.java:113) 
    at java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:93) 
    at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:140) 
    at org.hibernate.type.descriptor.java.DataHelper.extractBytes(DataHelper.java:171) 
    at org.hibernate.type.descriptor.java.BlobTypeDescriptor.unwrap(BlobTypeDescriptor.java:121) 
    at org.hibernate.type.descriptor.java.BlobTypeDescriptor.unwrap(BlobTypeDescriptor.java:45) 
    at org.hibernate.type.descriptor.sql.BlobTypeDescriptor$4$1.doBind(BlobTypeDescriptor.java:105) 
    at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:92) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:305) 
    at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:300) 
    at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:57) 
    at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2599) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2853) 
    at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3291) 
    at org.hibernate.action.internal.EntityInsertAction.execute(EntityInsertAction.java:88) 
    at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354) 
    at org.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:275) 
    at org.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326) 
    at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52) 
    at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1127) 

にHibernate 4.1。 アンラップストリームをbyteaに休止するのはなぜですか?準備されたステートメントsetBinaryStreamを使用するには、どうすれば休止状態にすることができますか?本当に助けが必要です。

答えて

0

私はそれが働いていない理由を知らないし、それそれがなければならないが、それは私が休止状態を使用してデータベースにBLOBを保存するために行っている:POJOで

は、テーブルにマップされます。aにおける

private byte[] serializedDocx; // + getter and setter 

方法:myEntity.hbm.xml

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

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

HTH。

+0

お返事ありがとうございます。保存しようとしているBLOBは1GBのファイルで、RAMは限られています。私はByteArray()を呼び出すことはできません。ハイバネートを準備されたステートメント 'setBinaryStream(int parameterIndex、java.io.InputStream x)'にすることは可能ですか? – user1255418

1

私の問題は、メモリ内のオブジェクトにまだバイト配列が埋め込まれていると考えられます。 これは、ストリームをデータベースに保持するためにストリームを使用するかどうかとは別の問題です。

回避策を提案します。ブロブをPOJOに保存しないでください。 blobをまっすぐなJDBCを介してデータベースに保存するか、ディスク上に保存して、POJO(データベースの主キーまたはディスクパス/ファイル名のいずれか)のblobへの参照を保持してください。

次に、BLOBバックが必要な場合は、POJOから参照を取得し、ストリームベースのメソッドを使用して戻します。

必要になるたびにブロブを取得/保存する作業が増えますが、ブロブが大きすぎてメモリが必要ない場合は、他に選択肢がありません。