1

Oracle OCCAS サーバーでサーブレットを実行しています。現在、@Entity アノテーションを使用して、データベース内の一部のデータをアプリケーション内のエンティティ クラスにマップしています。ただし、EntityManager (@PersistenceContext) の注入に失敗しました。私の理解では、これは別のエンティティ EJB としてではなく、サーブレット コンテキストで実行されているためです。ただし、EntityManagerFactory を使用してマネージャーを作成することはできるので、現在はそれを使用しています。

ここで、アプリケーションを何度も再起動すると、PermGen スペース不足エラーが発生します。これはどういうわけか永続性に関連していると思います。finalize メソッドで EntityManager.close() への呼び出しがありますが、ログには表示されません。

これは悪い方法ですか? 別の Entity Bean が「必要」ですか、それとも EntityManager をクリーンアップするにはどうすればよいですか?

4

1 に答える 1

1

同様の問題があり、ThreadLocal とサーブレット フィルターを使用して解決しました。

これは私のブログの投稿で、あなたが何をする必要があるかを詳述しています。基本的に、サーブレット フィルターはエンティティ マネージャーをセットアップし、サーブレット呼び出しの完了後にそれを閉じます。エンティティ マネージャをスレッド ローカル変数として使用できるようにします (休止状態の推奨に従って)。また、フィルターで例外をキャッチし、ロールバックを実行する必要があります。

ところで、ファイナライズは、あなたが考える方法で呼び出されるとは限りません。 finalize JVM が終了する前に呼び出す必要がありますが、それ以外では長い時間がかかる可能性があります。

于 2008-11-20T15:45:14.263 に答える