質問

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

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

これは物事を行うのに悪い方法ですか-私は「必要」ですか?別のEntity Beanを使用するか、EntityManagerをクリーンアップする方法を教えてください。

役に立ちましたか?

解決

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top