2009-05-29 23 views
5

ちょうど最近、Hibernateを使い始めましたが、まだ動作しています。セッションが閉じられたら、メモリを解放するようにHibernateに強制するには?

すべてのセッションが終了して参照が有効範囲外になっても、休止状態では以前に使用されたデータベース値がキャッシュに保持されているように見えます。

複数のパスでテーブルのセットから読み込むコードがあります。すべてのメモリが非常に控えめに解放されているため、後でパスが遅くなってクロールになります。

Hibernateにキャッシュをクリアさせる方法はありますか?

System.gc()への明示的な呼び出しは役に立ちません。 (はい、それは示唆です)

追加情報:第2レベルのキャッシュを明示的に無効にしました。

+3

?セッション管理にはどのような戦略を使用していますか? "セッションごとのスレッド"? –

+0

スレッド単位のセッションを使用していますが、第2レベルのキャッシュを明示的に無効にしました – StudioEvoque

答えて

10

Session.clearを呼び出して、第1レベルのキャッシュをクリアすることができます。保留中の変更をデータベースに書き込むには、まずSession.flushを呼び出してください。問題が「解決」されたら、セッションの参照を保持しているものがあると思われ、キャッシュ内のオブジェクトがガベージコレクションされないようにします。リークを追跡するには、プログラムのヒープダンプを取得する必要があります。

+0

問題を「修正」しました:) 提案したように、私たちは "HibernateUtils"セッション参照を保持しています。 – StudioEvoque

+0

また、Springなどのフレームワークを使ってHibernateのセッションやトランザクションを管理することもできます。 –

+0

ありがとう、この提案は、私が最後の数日間私のJavaアプリケーションを殺している問題を解決するのに役立ちました! – mahonya

2

Hibernateには、オプションの第2レベルのキャッシュもあります。私はロブに同意します。最も簡単な方法は、セッションが終了した後も何がメモリに残っているのかを確認することです。

私の現在のお気に入りのツールは、YourKitです。商用であり、正確には安いものではありません。彼らは非常に安価な($ 99 IIRC)個人ライセンスオプションを提供していました。 Alfresco ECMのヒープ使用上の問題をトラブルシューティングする際に、私はYourKitを正確にこのタスクに使用しました。他のツールもあります(たとえば、CodeGear JGearsなど)。私もよく理解しています。

あなたは評価モードで製品を使用して検討するかもしれない - これはあなたの問題を見つけた場合には、そのキープを稼ぐかもしれません。)私はあなたがしてHibernateの二次キャッシュを使用していないと仮定し

+0

explict GCが助けにならない場合、オブジェクトは引き続きコードのどこかで参照する必要があります。メモリリーク検出機能付きプロファイラは、リークを引き起こす*経路を参照するため、IMHOへの最速パスです。運が良かった! –

関連する問題