Когда должен быть создан / открыт экземпляр EntityManagerFactory?

Хорошо, я прочитал кучу статей / примеров, как написать Entity Manager Factory в singleton.

Один из них мне легче понять:

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

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

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

Поэтому я написал class помощников 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 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? И почему ЭМП должна быть настолько сильной? Я читал о проблемах параллелизма, но поскольку я не опытный многопоточный грамматик, я не могу понять эту идею.

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

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

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

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

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

  • В JVM одновременно может быть доступно более одного экземпляра фабрики управления сущностями. Методы интерфейса EntityManagerFactory являются streamобезопасными.
  • Моностат против Синглтона
  • Синглтон с аргументами в Java
  • Зачем использовать синглтон вместо статических методов?
  • ASP.NET Singleton
  • Singleton через экземпляр JVM или приложения или экземпляр Tomcat
  • Почему сложно тестировать систему, которая зависит от синглетонов?
  • Двойная проверка блокировки в синглтоне
  • получение соединения db через singleton class
  • Синглтон: как его использовать
  • Единичное тестирование с одноточечными
  • Классы менеджеров Unity singleton
  • Давайте будем гением компьютера.