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