Spring-Hibernate 中的每个线程是否应该有一个 EntityManager?

blu*_*ker 8 java spring multithreading hibernate jpa

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

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

@Trasactional
public class myAppDao { 
@PersistenceContext
private EntityManager entityManager;
..
}
Run Code Online (Sandbox Code Playgroud)

还是我们应该做些不同的事情?

Sta*_*sev 11

是的,通常EntityManagerorSession绑定到线程(作为 ThreadLocal 变量实现)。@PersistenceContext注解被 Spring IoC/CDI 识别并以特殊方式处理以启用此功能。

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

或者,这可以使用OpenSessionInViewInterceptor或来实现OpenSessionInViewFilter