gpt4 book ai didi

java - 保持 JPA EntityManager 打开?

转载 作者:搜寻专家 更新时间:2023-10-30 19:44:41 25 4
gpt4 key购买 nike

我正在学习 JPA,示例中的一般模式如下所示:

EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
// ....
em.getTransaction().commit();
em.close();

现在我想知道为什么我们不断地创建和关闭 EntityManagers,而不是保持它打开并开始新的交易?保持打开状态与始终关闭状态相比有哪些好处和成本?

最佳答案

我想到了两个特定于 JPA 的原因:

  1. JPA 规范不保证 EntityManager 是线程安全的。因此,可移植 JPA 应用程序一次最多只能在一个线程中使用 EM。创建方法本地 EM 并在它超出范围之前关闭它的习惯用法鼓励对 EM 引用进行堆栈限制。

  2. 使用“扩展”持久性上下文生命周期的 EM 在其整个存在期间维护一个单一的持久性上下文。这意味着实体在 commit() 时停止自动分离。相反,它们必须手动分离,否则 EM 仍然负责跟踪它们。

这个问题实际上是旧的“何时合并对象”问题的特定于 JPA 的版本。这很难,但答案可能是“很少”。

old developerWorks post由 Java 并发专家 Brian Goetz 阐述了这一点。要点:池对于昂贵的对象非常有意义,比如数据库连接。但是对于像 EntityManager 这样的短期、小型和快速初始化的对象,池化或其他某种形式的长期引用保留是很难推销的。

但是,这是一个普遍的问题,所以肯定会有异常(exception)。也许应用程序很简单或单线程。那么这些关于线程安全的担忧就变得没有实际意义了。

关于java - 保持 JPA EntityManager 打开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3393186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com