我们正在设计一个使用 Spring-Hibernate 的应用程序,其中有 6 个线程同时运行。每个线程执行不同的操作并在公共(public)表中插入/更新一些记录(所有线程都在公共(public)表上工作)。
虽然我们知道我们可以只有一个 EntityManagerFactory
实例,但我们不确定我们应该有多少个 EntityManager
实例?我们应该创建六个实体管理器(每个线程一个)吗?我们应该如何创建 DAO?我们是否应该像下面那样创建一个 EntityManager
并为所有线程使用相同的 dao 类?我知道 EM 规范说它不是线程安全的,但我在某处读到,在 spring 的情况下注入(inject)的 EM 是线程安全的(尽管我不相信这个解释)。
@Trasactional
public class myAppDao {
@PersistenceContext
private EntityManager entityManager;
..
}
还是我们应该做些不同的事情?
最佳答案
是的,通常 EntityManager
或 Session
绑定(bind)到线程(作为 ThreadLocal 变量实现)。 @PersistenceContext
注释由 Spring IoC/CDI 识别,并以特殊方式处理以启用此功能。
您的应用程序中有一些层(通常标记为 @Transactional
)创建 EntityManager 并将其绑定(bind)到 ThreadLocal 变量。每次调用第一个 @Transactional
时都会发生这种情况。同样 - EntityManager
每次方法退出时都会关闭。
或者,这可以使用 OpenSessionInViewInterceptor
或 OpenSessionInViewFilter
实现。
关于java - Spring-Hibernate 中的每个线程都应该有一个 EntityManager 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42074270/