0

スレッド ローカルを使用して、休止状態のセッションを管理しています。最近、実稼働サーバーで OutOfMemory 例外が発生しています。heap_dump で Eclipse MAT を実行したところ、多くのセッションが tomcatse ThreadWithAttributes オブジェクトによって参照されているために閉じられていても、ガベージ コレクションが行われていないことがわかりました。これは今私を夢中にさせています。さまざまなフォーラムで同様の質問をしているが回答がない投稿をたくさん見ました。どんな援助でも大歓迎です。

ありがとう

4

2 に答える 2

0

Web アプリケーションで Hibernate セッションを使用している場合は、ThreadLocal の Session オブジェクトをリクエスト間で保持しないでください。スレッドを制御できないため、スレッドはコンテナーに属します。

Web リクエストの存続期間中に Session を作成して閉じる必要があり、Session オブジェクトをどこにでも渡したくない場合は、クリーンアップを処理する ServletFilter を作成することを検討する必要があります。これはすべてのリクエストで呼び出されます。また、開始した可能性のあるトランザクションをそのフィルターにコミットまたはロールバックさせることもできます。

その方法の簡単なレシピについては、このページをお読みください: http://community.jboss.org/wiki/OpenSessioninView

于 2010-09-09T23:05:44.620 に答える
0

お返事をありがとうございます。私は現在、getCurrentSession() を使用して、ビューで開いているセッションを使用しています。これは、セッションが要求ごとであることを意味し、transaction.commit() で閉じることができます。セッションが閉じられていることがわかりますが (null アウトされていません)、ThreadWithAttributes tomcat クラスが sessionImpl への参照を保持しているため、ガベージ コレクションが行われません。これはすべてのスレッドで発生します。私のデータベースは非常に大きいため、数時間または最大で 1 日後にメモリ不足エラーが発生し、サーバーをバウンスする必要があります。

于 2010-09-10T00:25:08.270 に答える