【发布时间】:2011-05-31 10:42:18
【问题描述】:
好的,我阅读了很多关于如何在单例中编写实体管理器工厂的文章/示例。
其中一个对我来说最容易理解:
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 必须是单例的?我阅读了有关并发问题的文章,但由于我没有多线程语法经验,所以我并不清楚这个想法。
【问题讨论】:
-
"为什么 EMF 必须是单例如此糟糕???"这句话我可能应该打开另一个问题....
标签: java jpa singleton entitymanager