2010-12-28 10 views
24

Ok, przeczytałem garść artykułów/przykładów jak napisać Entity Manager Factory w singleton.Kiedy należy utworzyć lub otworzyć instancję EntityManagerFactory?

Jednym z nich najłatwiejszy dla mnie do zrozumienia trochę:

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

dowiedziałem się, że EntityManagerFactory (EMF) powinny być tworzone tylko raz korzystniej w zakresie aplikacji. (?)

a także upewnić się, aby zamknąć EMF gdy jest używany

Więc napisałem EMF klasy pomocnika na użycie metody prowadzenia działalności gospodarczej:

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 

i mój sposób korzystania EmProvider:

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(); 
    } 

I zadbał, aby zamknąć EntityManager (eM) wewnątrz poziomie metody jak sugeruje. Ale kiedy należy wtedy zamknąć EntityManagerFactory? A dlaczego EMF ma być tak źle? Czytałem o problemach ze współbieżnością, ale ponieważ nie jestem doświadczonym gramatykiem wielu wątków, nie jestem w stanie jasno określić tego pomysłu.

+1

"A dlaczego EMF ma być tak źle?" to oświadczenie powinien prawdopodobnie otworzyć inne pytanie .... –

Odpowiedz

51
  • EntityManagerFactory instancje ciężkiej przedmiotów. Każda fabryka może przechowywać pamięć podręczną metadanych, pamięć podręczną stanu obiektu, pulę EntityManager , pulę połączeń i inne. Jeśli Twoja aplikacja nie potrzebuje już EntityManagerFactory, powinieneś zamknąć ją, aby zwolnić te zasoby.

  • Gdy EntityManagerFactory zamyka, wszystkie EntityManagers z tej fabryki, a co za tym idzie wszystkich podmiotów udało tymi EntityManagers stają nieprawidłowy.

  • Jest o wiele lepiej, aby utrzymać fabrykę otwarte przez dłuższy okres czasu niż wielokrotnie tworzyć i zamykać nowych fabryk. Dlatego większość aplikacji nigdy nie zamknie fabryki lub tylko zamknie ją, gdy aplikacja wyłączy się.

  • Tylko aplikacje, które wymagają wiele fabryk w różnych konfiguracjach mają oczywisty powód do tworzenia i bliskie wielu EntityManagerFactory instancji.

  • Tylko jeden EntityManagerFactory jest wolno być tworzone dla każdego rozmieszczone trwałości konfiguracji jednostka . Dowolna liczba instancji EntityManager może być utworzona z określonej fabryki.

  • Więcej niż jedna instancja menedżera encji wystąpienie może być dostępne jednocześnie w JVM .Metody interfejsu EntityManagerFactory są wątkowo bezpieczne.
+3

Myślę, że "EntityManagerFactory" nie powinien być zamknięty dla aplikacji internetowej online. – abbas

+1

Powinien być zamknięty, ale tylko wtedy, gdy aplikacja internetowa zostanie zatrzymana (użytkownik zatrzyma ją lub anuluje). Przykład: Implementowanie metody contextDestroyed z interfejsu ServletContextListener przy użyciu JSF – GabrielBB

+1

@ pvm14 Tak, zdecydowanie. Jeśli musisz iść swoją drogą i jeśli jest tam wszystko w dokumentacji i wszyscy rozumieją, stackoverlow nie pojawiłby się na zdjęciu. Ludzie nie głosowali niepotrzebnie. Jeśli nie lubisz, zostaw to, powstrzymaj się od publikowania nieistotnych komentarzy, zamiast tego spróbuj dodać więcej informacji, szczegółów, błędów itp., Jeśli możesz, co pomoże każdemu. –

Powiązane problemy