Spring-Hibernate中每个线程应该有一个EntityManager吗?

时间:2017-02-06 17:58:59

标签: java spring multithreading hibernate jpa

我们正在使用Spring-Hibernate设计一个应用程序,其中6个线程同时运行。每个线程执行不同的操作,并在公共表中插入/更新一些记录(所有线程都在公共表上工作)。

虽然我们知道我们只能有一个EntityManagerFactory个实例,但我们不确定应该有多少EntityManager个实例?我们应该创建六个实体管理器(每个线程一个)吗?我们应该如何创建DAO?我们应该只创建一个EntityManager如下所示并为所有线程使用相同的dao类吗?我知道EM规范说它不是线程安全的,但是在某些地方,在春天的情况下注入EM是线程安全的(虽然我不相信解释)。

@Trasactional
public class myAppDao { 
@PersistenceContext
private EntityManager entityManager;
..
}

或者我们应该做些不同的事情?

1 个答案:

答案 0 :(得分:2)

是的,通常EntityManagerSession绑定到线程(作为ThreadLocal变量实现)。 Spring IoC / CDI识别@PersistenceContext注释,并以特殊方式对其进行处理。

您的应用中有一些图层(通常标记为@Transactional)会创建EntityManager并将其绑定到ThreadLocal变量。每次调用第一个@Transactional时都会发生这种情况。同样 - 每次方法退出时,EntityManager都会关闭。

或者,也可以使用OpenSessionInViewInterceptorOpenSessionInViewFilter来实施。