当我们需要多个 EntityManager 时?

Posted

技术标签:

【中文标题】当我们需要多个 EntityManager 时?【英文标题】:When we need more than one EntityManager? 【发布时间】:2011-02-04 21:48:18 【问题描述】:

我正在学习 JPA,有一个问题:

在哪些情况下,我们的应用程序中需要多个EntityManager

我知道的两种情况如下:

当我们的应用程序是多线程应用程序并且多个线程需要 JPA 事务时,因为 EntityManager 不是线程安全的,我们需要每个线程一个 EntityManager

当任何线程需要多个并发事务时,我们在该线程中需要多个EntityManager,因为EntityManagerEntityTransaction 之间存在一对一的关系。


第一季度。是否还有其他情况需要多个EntityManager

第二季度。据我了解,每个 Persitence Unit 应该只有一个 EntityManagerFactory。我对么?如果不是,那么当我们需要每个 Persistence Unit 多个 EntityManagerFactory 时是什么情况?

【问题讨论】:

【参考方案1】:

Q1:EntityManager 最好与“好老”的 Hibernate 进行比较 Session:一个工作单元(一个简单的业务操作,例如“登录用户”、“下订单”等)。它不一定绑定到单个线程。只有当不同的线程在单个工作单元内执行相互依赖的数据库任务时,您才会遇到麻烦。您需要同步执行它们(最好在单个线程中按顺序执行)。例如,如果您有业务要求在用户登录时清理一些“旧日志”(这合理地不会干扰彼此的信息),您可以在单个工作单元内的两个单独线程中完美地执行它。

Q2:你的理解是正确的。但是,您可以创建多个,但这没有任何意义也没有任何好处。它只会增加大量开销。

【讨论】:

对于 Q1:我猜 Entity Manager 对象的开销应该最小,但我仍然想问有多少开销 :) 哇,这取决于线程彼此更复杂。那么可以肯定地说每个线程应该有 1 个 EM 吗?然后确保捕获任何异常,因为您有多个线程使用同一个表,对吧? 是的,因为 EM 不是线程安全的,如果我围绕它创建一个包装器并在内部调用 EM 的保存/更新的包装器中包含“同步”保存/更新方法,它是否可以跨多个线程使用.我也从不清除/关闭 EM 吗?我认为同时读写仍然存在问题。你能告诉我你的cmets吗?

以上是关于当我们需要多个 EntityManager 时?的主要内容,如果未能解决你的问题,请参考以下文章

使用Spring时如何注入多个JPA EntityManager(持久化单元)

使用多个数据源时 Spring 中的多个实体管理器问题

当其中一个更新或保存更改时,哪些数据会看到一组 EntityManager?

EntityManager方法简介

使用 EntityManager 在实体上设置悲观锁定

制作多个 EntityManager(Spring-Boot-JPA、Hibernate、MSSQL)