Когда должен быть создан/открыт экземпляр EntityManagerFactory?
Хорошо, я прочитал кучу статей/примеров, как написать Entity Manager Factory в singleton.
Один из них для меня легче всего понять:
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 должен быть настолько сильным? Я читал о проблемах concurrency, но поскольку я не опытный многопоточный грамматик, я не могу быть предельно ясным в этой идее.
Ответы
Ответ 1
-
Объекты EntityManagerFactory:
тяжеловесные предметы. Каждый factory
может поддерживать кеш метаданных,
кеш состояния объекта, EntityManager
пул, пул соединений и т.д. Если
ваше приложение больше не нуждается в
EntityManagerFactory, вы должны
закройте его, чтобы освободить эти ресурсы.
-
Когда EntityManagerFactory закрывается,
все EntityManagers из этого factory,
и, кроме того, все
этими EntityManager, становятся
недействителен.
-
Гораздо лучше сохранить factory
открытые в течение длительного периода времени, чем
неоднократно создавать и закрывать новые
заводы. Таким образом, большинство приложений
никогда не закроет factory или только
закройте его, когда приложение
выход.
-
Только приложения, требующие
несколько заводов с разными
конфигурации имеют очевидную причину
для создания и закрытия нескольких
EntityManagerFactory экземпляры.
-
Только один EntityManagerFactory
разрешено создавать для каждого
развернутый блок персистентности
конфигурации. Любое количество
Экземпляры EntityManager могут быть
созданный из заданного factory.
- Более одного менеджера объектов factory
экземпляр может быть доступен
одновременно в JVM. Методы EntityManagerFactory
интерфейс являются потокобезопасными.