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

标签 java spring multithreading hibernate jpa

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

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

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

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

最佳答案

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

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

或者,这可以使用 OpenSessionInViewInterceptorOpenSessionInViewFilter 实现。

关于java - Spring-Hibernate 中的每个线程都应该有一个 EntityManager 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42074270/

相关文章:

python - 从 threading.Thread 子类返回 wx.Panel

java - 如何使用RxJava进行文件解析和SQL生成?

java - 如果我想发送http请求,用Java的outputstream写什么呢?

java - 来自已排序数组的 X 的 floor 和 ceil

java - 如何使用 Spring 正确关闭执行程序服务?

java - Spring WebService 不初始化服务和消费者的 bean

java - 将 MongoTemplate 传递给自定义存储库实现

java - 即使启用版本控制,Google 云存储 Blob.delete() 也不会创建存档

java - 显示无法解析的日期 : "09:30 AM" (at offset 6) in java android

c++ - 为什么win api线程执行函数,而标准线程不执行?