2010-12-28 27 views
24

[OK]を、記事の例/シングルトンでエンティティマネージャファクトリを記述する例を読む。EntityManagerFactoryインスタンスはいつ作成する必要がありますか?

そのうちの一つに、私は少しを理解するための最も簡単な:

http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html

私はのEntityManagerFactory(EMF)は唯一のアプリケーションのスコープ内に一度、好ましくは、作成する必要があることを学びました。 (?)

そしてまた、それが使われていたら、EMFを閉じてください

だから私は、ビジネスメソッドが使用するEMFヘルパークラスを書いた:

EmProviderを使用して
public class EmProvider { 

    private static final String DB_PU = "KogaAlphaPU"; 

    public static final boolean DEBUG = true; 

    private static final EmProvider singleton = new EmProvider(); 

    private EntityManagerFactory emf; 

    private EmProvider() {} 

    public static EmProvider getInstance() { 
     return singleton; 
    } 


    public EntityManagerFactory getEntityManagerFactory() { 
     if(emf == null) { 
      emf = Persistence.createEntityManagerFactory(DB_PU); 
     } 
     if(DEBUG) { 
      System.out.println("factory created on: " + new Date()); 
     } 
     return emf; 
    } 

    public void closeEmf() { 
     if(emf.isOpen() || emf != null) { 
      emf.close(); 
     } 
     emf = null; 
     if(DEBUG) { 
      System.out.println("EMF closed at: " + new Date()); 
     } 
    } 

}//end class 

そして、私の方法:

public String foo() { 
    EntityManager em = null; 
    List<Object[]> out = null; 
    try { 

     em = EmProvider.getInstance().getEntityManagerFactory().createEntityManager(); 
     Query query = em.createNativeQuery(JPQL_JOIN); //just some random query 
     out = query.getResultList(); 
    } 
    catch(Exception e) { 
     //handle error.... 
    } 
    finally { 
     if(em != null) { 
      em.close(); //make sure to close EntityManager 
     } 
     //should I not close the EMF itself here????? 
     EmProvider.getInstance().closeEmf(); 
    } 

メソッドレベルでEntityManager(em)を閉じてください。しかし、EntityManagerFactoryをいつ閉じるべきですか?そしてなぜEMFはシングルトンだと悪いのですか?私は並行性の問題について読んでいますが、マルチスレッド・グラマーを経験していないので、私はこの考え方では本当に明確ではありません。

+1

「なぜEMFはシングルトンでなければならないのですか?」私はおそらく別の質問を開く必要があります.... –

答えて

51
  • EntityManagerFactoryインスタンスは、 ヘビーウェイトオブジェクトです。各工場 は、メタデータキャッシュ オブジェクト状態キャッシュ、EntityManager プール、接続プールなどを保持している場合があります。 アプリケーションに EntityManagerFactoryが不要な場合は、 を閉じてこれらのリソースを解放する必要があります。

  • のEntityManagerFactoryが閉じ、 その工場からのすべてのEntityManagersは、 ひいては全てのエンティティは 無効となり、それらのEntityManagersによって を管理します。

  • 繰り返しに よりも長い期間のためのオープン工場 を保つ作成し、新しい 工場を閉鎖するはるかに優れています。したがって、ほとんどのアプリケーション は工場を決して閉じることはなく、 が終了するときには だけを閉じます。異なる 構成で 複数の工場を必要と

  • アプリケーションのみを作成するための明白な理由 と近い複数の のEntityManagerFactoryのインスタンスを持っています。

  • つのみのEntityManagerFactory

    は、各 展開永続ユニット 構成の作成が許可されます。 任意の数のEntityManagerインスタンスは、特定のファクトリから作成された です。

  • 複数のエンティティマネージャファクトリ インスタンスが、同時にJVMで に存在する可能性があります。EntityManagerFactory インターフェイスのメソッドはスレッドセーフです。
+3

私は 'EntityManagerFactory'は、オンラインWebアプリケーションのために閉じてはいけないと思います。 – abbas

+1

Webアプリケーションが停止したとき(ユーザーがWebアプリケーションを停止または解凍したとき)にのみ閉じる必要があります。例:JSF使用時にServletContextListenerインターフェースからcontextDestroyedメソッドを実装する – GabrielBB

+1

@ pvm14確かに。あなたの方法で行く必要がある場合、&そこにドキュメント&誰もが理解している場合、stackoverlowは画像に入っていないだろう。人々は不必要に投票していません。あなたが好きでないなら、無関係なコメントを掲示するのをやめ、できるだけ多くの情報、詳細、間違いなどを追加してみてください。 –

関連する問題