Когда должен быть создан / открыт экземпляр EntityManagerFactory?
Хорошо, я прочитал кучу статей / примеров, как написать Entity Manager Factory в singleton.
Один из них мне легче понять:
http://javanotepad.blogspot.com/2007/05/jpa-entitymanagerfactory-in-web.html
- Шаблон Singleton в C ++
- Проблемы с шаблоном Singleton
- Получить контекст приложения из classа non activity singleton
- Сериализовать статический class?
- Необходимость волатильного модификатора в двойной проверенной блокировке в .NET.
Я узнал, что 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? И почему ЭМП должна быть настолько сильной? Я читал о проблемах параллелизма, но поскольку я не опытный многопоточный грамматик, я не могу понять эту идею.
- Thread Safe C # Singleton Pattern
- Использование шаблона проектирования Singleton для SQLiteDatabase
- Почему внедрение шаблона Singleton в Java-коде (иногда) считается анти-шаблоном в Java-мире?
- Каков эффективный способ реализации одноэлементного шаблона в Java?
- Синглтон в iOS 5?
- Синглтоны: хороший дизайн или костыль?
- Реализация Singleton с Enum (на Java)
- Синглтонский дизайн: ловушки
-
Экземпляры EntityManagerFactory представляют собой тяжеловесные объекты. Каждая фабрика может поддерживать кэш метаданных, кеш состояния объекта, пул EntityManager, пул подключений и т. Д. Если ваше приложение больше не нуждается в EntityManagerFactory, вы должны закрыть его, чтобы освободить эти ресурсы.
-
Когда EntityManagerFactory закрывается, все EntityManagers с этой фабрики и по всем объектам, управляемым этими EntityManagers, становятся недействительными.
-
Гораздо лучше держать фабрику открытой в течение длительного периода времени, чем многократно создавать и закрывать новые заводы. Таким образом, большинство приложений никогда не закрывают завод или закрывают его только при выходе приложения.
-
Только приложения, требующие нескольких фабрик с разными конфигурациями, имеют очевидную причину для создания и закрытия нескольких экземпляров EntityManagerFactory.
-
Разрешается создавать только один EntityManagerFactory для каждой развернутой конфигурации единицы сохранения. Любое количество экземпляров EntityManager может быть создано на данной фабрике.
- В JVM одновременно может быть доступно более одного экземпляра фабрики управления сущностями. Методы интерфейса EntityManagerFactory являются streamобезопасными.