【发布时间】:2014-01-26 15:46:39
【问题描述】:
如何在多线程应用程序中使用 Hibernate EntityManager(例如,每个客户端连接在服务器上启动它自己的线程)。
EntityManager 是否应该只由 EntityManagerFactory 创建一次,例如:
private static EntityManagerFactory emf = Persistence.createEntityManagerFactory("unit");
private static EntityManager em = emf.createEntityManager();
public static EntityManager get() {
return em;
}
或者我是否必须为每个线程以及每个关闭 EM 的事务重新创建实体管理器?
我的 CRUD 方法如下所示:
public void save(T entity) {
em.getTransaction().begin();
em.persist(entity);
em.getTransaction().commit();
em.close();
}
public void delete(T entity) {
em.getTransaction().begin();
em.remove(entity);
em.getTransaction().commit();
em.close();
}
我必须在每个.begin() 之前运行emf.createEntityManager() 吗?还是因为每个人都在使用自己的缓存创建自己的 EntityManager 实例而遇到麻烦?
【问题讨论】:
-
因此,显然我将拥有一个 EMF,并为每个线程创建一个新的 EM。但仍然:如果我在每次交易后关闭 EM,我是否需要每次(在一个线程中多次)重新创建 EM?
-
关闭 EM 后就不能再使用了。但是您当然可以使用一个 EM 进行多笔交易。请记住,EM 是一种轻量级对象,专为廉价创建而设计。确定您的工作单元并为它们使用一个 EM。您可能会觉得 reference documentation 很有趣。
标签: java database hibernate entitymanager