Java 每个功能的EntityManagerFactory?
我是否应该在每个函数中创建并关闭EntityManagerFactory? 或者我应该在应用程序启动时创建它,在应用程序关闭时关闭它?我怎样才能做到这一点 例如: 我有两个职能: 从数据库获取对象的函数:Java 每个功能的EntityManagerFactory?,java,hibernate,jpa,Java,Hibernate,Jpa,我是否应该在每个函数中创建并关闭EntityManagerFactory? 或者我应该在应用程序启动时创建它,在应用程序关闭时关闭它?我怎样才能做到这一点 例如: 我有两个职能: 从数据库获取对象的函数: private List<SomeItems> getItems() { List<SomeItems> resultList = new ArrayList<SomeItems>(); entityManagerFactory = Pe
private List<SomeItems> getItems() {
List<SomeItems> resultList = new ArrayList<SomeItems>();
entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
TypedQuery<SomeItems> query = entityManager.createQuery(
"select n from SomeItems n", SomeItems.class);
resultList = query.getResultList();
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
return resultList;
}
private List getItems(){
List resultList=new ArrayList();
entityManagerFactory=Persistence.createEntityManagerFactory(“myDatabase”);
entityManager=entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
TypedQuery查询=entityManager.createQuery(
“从SomeItems n中选择n”,SomeItems.class);
resultList=query.getResultList();
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
返回结果列表;
}
仅获取项目名称的函数:
private List<String> getItemsName() {
List<String> resultList = new ArrayList<String>();
entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
TypedQuery<String> query = entityManager.createQuery(
"select n.name from SomeItems n", String.class);
resultList = query.getResultList();
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
return resultList;
}
private List getItemsName(){
List resultList=new ArrayList();
entityManagerFactory=Persistence.createEntityManagerFactory(“myDatabase”);
entityManager=entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
TypedQuery查询=entityManager.createQuery(
“从某些项中选择n.name”,String.class);
resultList=query.getResultList();
entityManager.getTransaction().commit();
entityManager.close();
entityManagerFactory.close();
返回结果列表;
}
我应该如何改进呢?每次创建EntityManagerFactory都不好。它很贵。按需创建一次。可以多次创建EntityManager。但是工厂完全没有。您可以使用带有惰性或急切初始化类型的单例。你的电话。或者只是某个地方的静态初始化程序块。有很多选择。关键点不是在每次调用时创建工厂,而是重用。好的,这里有一个示例实现可能不是最好的,但它可以工作
class EntityManagerFactoryHolder {
private static EnityManager entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
public EntityManagerFactory getEntityManager(){
return entityManagerFactory;
}
}
这是具有急切初始化的单例。如果你想在网上查一查。你能给出一些代码示例吗?那以后再关它怎么样?我怎样才能做到这一点呢?关于实体管理器,你可以用try{}finally{entityManager.close()}来包装这个方法。也许我错了,但是这一行呢<代码>entityManagerFactory.close()代码>是否需要它?或者我应该什么时候把它放进去?在一般情况下,当你的应用程序全天候运行时,你不必关闭它。如果你长时间不活动,那么你可以关闭它。为什么这个答案不再被接受?有什么变化吗?我希望每个JPA提供商的所有JPA文档都提到,创建EMF很昂贵,而EM很便宜。如果您的提供商的文档没有这样说,那么建议您向他们提出问题