在我的应用程序管理事务的情况下,我必须选择:
- 在每个新事务之前使用一个
EntityManager
并调用。clear()
分享EntityManager
使用ThreadLocal
. EntityManager
为每笔交易创建一个新的。
我对JPA没有太多经验。我的问题是哪一个在性能方面更好?
在我的应用程序管理事务的情况下,我必须选择:
EntityManager
并调用。clear()
分享EntityManager
使用ThreadLocal
.EntityManager
为每笔交易创建一个新的。我对JPA没有太多经验。我的问题是哪一个在性能方面更好?
我建议为每个事务创建一个新的 EntityManager。这就是 JPA 的设计方式。EntityManager 不应该是一个昂贵的创建对象。(虽然 EntityManagerFactory 非常昂贵,所以请确保您只有其中一个)。
okwap 提供的链接非常有帮助。为了确保它不会漏掉,并遵守董事会规则,我在此处放了一份副本:
- EntityManager 包含一个持久性上下文,它将跟踪 一切都通过它读取,所以为了避免臃肿的内存,你应该 获得一个新的,或在某个时候清除它 - 如果你通过两个不同的 EntityManager 读取同一个对象 会得到不同的对象,所以对象身份也会丢失,这 是要考虑的事情
基于此,我将补充说,如果同时其他人执行了数据库事务,那么读取两个不同的 EntityManager 甚至可能会给出具有不同内容的对象。但是如果通过同一个实体管理器重复读取,第二次读取只会从实体管理器缓存中获取对象,因此更新的状态将不可见。