我正在学习 JPA,示例中的一般模式似乎如下:
EntityManager em = factory.createEntityManager();
em.getTransaction().begin();
// ....
em.getTransaction().commit();
em.close();
现在我想知道为什么我们不断创建和关闭 EntityManager,而不是保持它打开并开始新事务?保持开放与始终关闭相比有何好处和成本?
我想到了两个 JPA 特定的原因:
JPA 规范不保证 EntityManager 是线程安全的。因此,便携式 JPA 应用程序一次最多只能在一个线程中使用 EM。创建方法本地 EM 并在其超出范围之前将其关闭的习惯做法鼓励堆栈限制 EM 引用。
使用“扩展”持久性上下文生命周期的 EM 在其整个存在期间维护单个持久性上下文。这意味着实体停止自动分离commit()
。相反,它们必须手动分离,否则 EM 仍然负责跟踪它们。
这个问题实际上是旧的“何时池对象”问题的特定于 JPA 的版本。这是一个很难的问题,但答案可能是“很少”。
This 旧的developerWorks 帖子 http://www.ibm.com/developerworks/java/library/j-jtp09275.html?ca=dgr-jw22JavaUrbanLegendsJava 并发专家 Brian Goetz 阐述了这一点。要点:池对于昂贵的对象(例如数据库连接)非常有意义。但对于像 EntityManager 这样的短命、小型和快速初始化的对象,池化或其他形式的长期引用保留是很难推销的。
但是,这是一个普遍问题,所以肯定会有例外。也许应用程序很简单或单线程。那么这些关于线程安全的担忧就变得毫无意义了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)