自家製の永続化フレームワークをJPAに移行し始めたばかりです。
永続化フレームワークが多くの配管を隠していることを考えると、EntityManagersを閉じないとリソースリークが発生するかどうか、またはフレームワークがそれらを収集して閉じるかどうかを知りたいと思っています。
私はすべての場所でそれらを閉じるつもりですが、私は持っていますか?
現在、TopLinkを使用しているのは、NetBeansで簡単に機能するからです。しかし、他のJPAプロバイダーを調査できてうれしいです。
入手方法によって異なります。
EntityManagerFactoryを使用して作成した場合は、使用するフレームワークに関係なく、閉じる必要があります。
依存性注入を使用して(EJBおよび@PersistenceContextアノテーションを使用して)入手した場合は、手動で閉じないでください(わかっているとRuntimeExceptionが発生します)。
あなたがすべき。
フレームワークには、EMの使用方法がわからないため、EMを閉じることはできません(ただし、ファイナライズ時は保証されません)。はい、閉じないとリソースリークが発生します。
考え方は、「Java.sql.Connectionを常に閉じる」(非アクティブな状態で自動的に閉じる設定がいくつかのデータソースにあります)または「Hibernateセッションを常に閉じる」と同じです。
さらに、移植可能なコードを作成する予定がある場合、特定のJPAプロバイダーに「スマート」に依存するべきではありません。他のプロバイダーは時間内にEMを閉じることができない場合があります。
リポジトリで_@PersistenceContext
_注釈を使用してEntityManager
を取得しました。接続プールがmaxPoolSize
に達した後、クリーンアップされないことがわかります。
ただし、EntityManager
を使用してEntityManagerFactory
を作成し、entitymanager.close()
を呼び出すと、接続がクリーンアップされます。接続プールライブラリとして_c3p0
_を使用しています。