我们正在使用Spring-Hibernate设计一个应用程序,其中6个线程同时运行。每个线程执行不同的操作,并在公共表中插入/更新一些记录(所有线程都在公共表上工作)。
虽然我们知道我们只能有一个EntityManagerFactory
个实例,但我们不确定应该有多少EntityManager
个实例?我们应该创建六个实体管理器(每个线程一个)吗?我们应该如何创建DAO?我们应该只创建一个EntityManager
如下所示并为所有线程使用相同的dao类吗?我知道EM规范说它不是线程安全的,但是在某些地方,在春天的情况下注入EM是线程安全的(虽然我不相信解释)。
@Trasactional
public class myAppDao {
@PersistenceContext
private EntityManager entityManager;
..
}
或者我们应该做些不同的事情?
答案 0 :(得分:2)
是的,通常EntityManager
或Session
绑定到线程(作为ThreadLocal变量实现)。 Spring IoC / CDI识别@PersistenceContext
注释,并以特殊方式对其进行处理。
您的应用中有一些图层(通常标记为@Transactional
)会创建EntityManager并将其绑定到ThreadLocal变量。每次调用第一个@Transactional
时都会发生这种情况。同样 - 每次方法退出时,EntityManager
都会关闭。
或者,也可以使用OpenSessionInViewInterceptor
或OpenSessionInViewFilter
来实施。