0

私はHibernateエンティティを持っています:

@Entity
class Foo {
    //...
    @Lob
    public byte[] getBytes() { return bytes; }
    //....
}

私のVMは512MBの最大ヒープサイズで構成されています。75 MBの大きなオブジェクトを持つオブジェクトを永続化しようとすると、OutOfMemoryErrorが発生します。

スタックトレースのメソッドの名前(StringBuilder、ByteArrayBlobType.toLoggableString、pretty.Printer.toString)は、hibernateがオブジェクトを含む非常に大きなログメッセージを書き込もうとしていることを示しています。

hibernateが大量のメモリを使用している理由について正しいですか?この問題を回避する最も簡単な方法は何ですか?

java.lang.OutOfMemoryError: Java heap space
at java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:44)
at java.lang.StringBuilder.<init>(StringBuilder.java:81)
at org.hibernate.type.ByteArrayBlobType.toString(ByteArrayBlobType.java:117)
at org.hibernate.type.ByteArrayBlobType.toLoggableString(ByteArrayBlobType.java:127)
at org.hibernate.pretty.Printer.toString(Printer.java:53)
at org.hibernate.pretty.Printer.toString(Printer.java:90)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:97)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.jboss.seam.persistence.HibernateSessionProxy.flush(HibernateSessionProxy.java:181)
4

4 に答える 4

3

問題を解決しました。ロギングをオフにすると問題は解決しましたが、JBoss アプリケーション サーバーで実行している場合、サーバー自体の log4j.xml ファイルがアプリケーションのクラスパスにあるものを上書きすることを理解していませんでした。

/jboss-4.2.3.GA/server/default/conf/log4.xml を開き、これを挿入しました:

<category name="org.hibernate">
    <priority value="ERROR"/>
</category>

これにより、私が見ている問題が修正されます。

于 2009-11-17T19:18:14.093 に答える
0

最初のテストは、それが本当にロギングの問題であるかどうかを確認することです。どのロガーを使用していますか?log4jの場合は、log4j.propertiesファイルの次の行を使用してHibernateからのすべてのログをオフにすることができます。

log4j.logger.org.hibernate = OFF

これは、アプリを動作させるための究極の理想的な方法ではないかもしれませんが、ロギングが問題であるかどうかをテストするのに役立つ場合があります。

于 2009-11-17T17:38:07.633 に答える
0

きれいなプリンターはおそらくバイトを16進表記に変換しているので(たとえば、「0x55 0xF3 ...)」、ブロブの各バイトに対して4バイトの出力が得られるため、300Mの出力、それ、およびVM内の他のものとのバッファリングおそらく制限を超えています。

于 2009-11-17T17:41:09.530 に答える
0

次の 2 つの Hibernate プロパティを試してみるとどうなりますか?

hibernate.show_sql=false
hibernate.format_sql=false
于 2010-09-24T15:08:28.553 に答える