76

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

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

私はすべての場所でそれらを閉鎖するつもりですが、そうしなければなりませんか?

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

4

3 に答える 3

92

どのように入手したかによります。

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

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

于 2008-10-21T08:23:10.273 に答える
12

あなたがすべき。

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

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

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

于 2008-10-21T01:31:58.090 に答える
5

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

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

于 2012-09-18T09:42:00.297 に答える