我应该在每个函数中创建和关闭EntityManagerFactory吗? 或者我应该在应用程序启动时创建它并在应用程序关闭时关闭它?我怎样才能做到这一点?
例如:
我有两个功能:
从数据库获取对象的函数:
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<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;
}
我应该如何改进?
答案 0 :(得分:2)
每次创建EntityManagerFactory都不行。这非常贵。按需创建一次。可以多次创建EntityManager。但工厂完全没有。您可以使用具有惰性或急切初始化类型的单例。你的来电。或者只是一个静态初始化块。很多选择。关键点不是在每次调用重用时创建工厂。好的这里是一个示例实现可能不是最好的,但它的工作原理。
class EntityManagerFactoryHolder {
private static EnityManager entityManagerFactory = Persistence.createEntityManagerFactory("myDatabase");
public EntityManagerFactory getEntityManager(){
return entityManagerFactory;
}
}
这是具有EAGER初始化的单例。如果你想让LAZY在互联网上查找。