質問

自作の永続化フレームワークを JPA に移行し始めたところです。

永続化フレームワークが多くの配管を隠していることを考えると、EntityManager を閉じないとリソース リークが発生するのか、それともフレームワークが EntityManager を収集して閉じてくれるのかを知ることに興味があります。

あらゆる場所でそれらを閉じるつもりですが、そうしなければなりませんか?

現時点では、NetBeans で簡単に動作するという理由だけで TopLink を使用していますが、他の JPA プロバイダも喜んで調査します。

役に立ちましたか?

解決

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

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

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

他のヒント

あなたがすべき。

フレームワークは、ユーザーが EM をどのように使用するつもりなのかを知らないため、EM を閉じることができません (終了時は例外ですが、終了する可能性はありますが、終了することは保証されていません)。はい、閉じないとリソース リークが発生します。

この考え方は、「常に java.sql.Connection を閉じる」 (一部のデータ ソースには非アクティブ時に自動的に閉じる設定があるにもかかわらず) または「常に Hibernate セッションを閉じる」と同じです。

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

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

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

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