web-dev-qa-db-ja.com

すべてのEntityManagerをclose()する必要がありますか?

自家製の永続化フレームワークをJPAに移行し始めたばかりです。

永続化フレームワークが多くの配管を隠していることを考えると、EntityManagersを閉じないとリソースリークが発生するかどうか、またはフレームワークがそれらを収集して閉じるかどうかを知りたいと思っています。

私はすべての場所でそれらを閉じるつもりですが、私は持っていますか?

現在、TopLinkを使用しているのは、NetBeansで簡単に機能するからです。しかし、他のJPAプロバイダーを調査できてうれしいです。

64
stevemac

入手方法によって異なります。

EntityManagerFactoryを使用して作成した場合は、使用するフレームワークに関係なく、閉じる必要があります。

依存性注入を使用して(EJBおよび@PersistenceContextアノテーションを使用して)入手した場合は、手動で閉じないでください(わかっているとRuntimeExceptionが発生します)。

77
jb.

あなたがすべき。

フレームワークには、EMの使用方法がわからないため、EMを閉じる​​ことはできません(ただし、ファイナライズ時は保証されません)。はい、閉じないとリソースリークが発生します。

考え方は、「Java.sql.Connectionを常に閉じる」(非アクティブな状態で自動的に閉じる設定がいくつかのデータソースにあります)または「Hibernateセッションを常に閉じる」と同じです。

さらに、移植可能なコードを作成する予定がある場合、特定のJPAプロバイダーに「スマート」に依存するべきではありません。他のプロバイダーは時間内にEMを閉じる​​ことができない場合があります。

11

リポジトリで_@PersistenceContext_注釈を使用してEntityManagerを取得しました。接続プールがmaxPoolSizeに達した後、クリーンアップされないことがわかります。

ただし、EntityManagerを使用してEntityManagerFactoryを作成し、entitymanager.close()を呼び出すと、接続がクリーンアップされます。接続プールライブラリとして_c3p0_を使用しています。

4
Puneet