2010-12-28 5 views
24

Хорошо, я прочитал кучу статей/примеров, как написать Entity Manager Factory в singleton.Когда должен создаваться/открываться экземпляр EntityManagerFactory?

Один из них самый простой для меня, чтобы понять немного:

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

я узнал, что EntityManagerFactory (EMF) должен быть создан только один раз, предпочтительно в области приложения. (?)

А также убедитесь, чтобы закрыть EMF, когда он используется

Так что я написал EMF вспомогательный класс для бизнес-методы для использования:

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 

И мой метод с использованием 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(); 
    } 

Я позаботился о том, чтобы закрыть EntityManager (em) в пределах уровня метода, как было предложено. Но когда должен быть закрыт EntityManagerFactory? И почему EMF должна быть синглтон такой плохой ??? Я читал о проблемах параллелизма, но поскольку я не опытный многопоточный грамматик, я не могу понять эту идею.

+1

«И почему ЭМП должна быть настолько сильной?» это утверждение, вероятно, должно открыть другой вопрос .... –

ответ

51
  • Образцы EntityManagerFactory: тяжеловесные предметы. Каждая фабрика может поддерживать кеш метаданных, кеш состояния объекта, EntityManager пул, пул соединений и т. Д. Если ваша заявка больше не нужна EntityManagerFactory, вы должны закрыть ее, чтобы освободить эти ресурсы.

  • Когда EntityManagerFactory закрывается, все EntityManagers от этого завода, и по расширению всех субъектов удались этим EntityManagers, становятся недействительными.

  • Это гораздо лучше держать завод открыт в течение длительного периода времени, чем многократно создавать и закрывать новые заводы. Таким образом, большинство приложений никогда не закроют завод или только закройте его, когда приложение выходит.

  • только приложения, которые требуют нескольких заводов с различными конфигурациями имеют очевидную причину создать и закрыть несколько EntityManagerFactory экземпляров.

  • Только один EntityManagerFactory является разрешено быть создана для каждого развернут сохраняемости конфигурации блока . Любое число из экземпляров EntityManager может быть , созданное на данной фабрике.

  • Одновременно в JVM может быть один экземпляр-менеджер .Методы интерфейса EntityManagerFactory являются потокобезопасными.
+3

Я думаю, что «EntityManagerFactory» не следует закрывать для онлайн-приложения. – abbas

+1

Он должен быть закрыт, но только при остановке веб-приложения (пользователь останавливает его или разворачивает). Пример: реализация метода contextDestroyed из интерфейса ServletContextListener при использовании JSF – GabrielBB

+1

@ pvm14 Да, определенно. Если нужно идти своим путем, и если там все в документации и все понимают, stackoverlow не попал бы в картину. Люди не голосовали без необходимости. Если вам не нравится, оставьте его, воздержитесь от публикации неуместных комментариев, вместо этого попробуйте добавить дополнительную информацию, детали, ошибки и т. Д., Если сможете, что поможет всем. –

Смежные вопросы