【问题标题】:Reusing entity manager by em.clear() or creating a new entity manager?通过 em.clear() 重用实体管理器还是创建一个新的实体管理器?
【发布时间】:2013-04-14 21:24:04
【问题描述】:

在我的应用程序管理事务的情况下,我必须选择:

  1. 在每个新事务之前使用一个 EntityManager 并调用 clear()。使用ThreadLocal 分享EntityManager
  2. 为每个事务创建一个新的EntityManager

我在 JPA 方面没有太多经验。我的问题是哪一个在性能方面更好?

【问题讨论】:

    标签: jpa jpa-2.0 entitymanager


    【解决方案1】:

    我建议为每个事务创建一个新的 EntityManager。这就是 JPA 的设计方式。 EntityManager 不应该是一个昂贵的创建对象。 (虽然 EntityManagerFactory 非常昂贵,所以请确保您只有其中一个)。

    【讨论】:

    • 使用第一种方法时,有时 EntityManager 不处于“同步”状态,因为ThreadLocal 将为每个线程生成新的 EntityManager。我只剩下一个选择:为每个事务创建一个新的 EntityManager。
    • James Sutherland 建议在请求期间重用 EntityManager。主要原因是持久化上下文共享。你同意吗? coderanch.com/t/550734/ORM/databases/Practise-EntityManager
    【解决方案2】:

    okwap 提供的链接很有帮助。为了确保它不会漏掉,并遵守董事会规则,我在此处放了一份副本:

    - EntityManager 包含一个持久性上下文,它将跟踪 一切都通过它读取,所以为了避免臃肿的内存,你应该 获得一个新的,或在某个时候清除它 - 如果你通过两个不同的 EntityManager 读取同一个对象 会得到不同的对象,所以对象身份也会丢失,这 是要考虑的事情

    基于此,我将补充说,如果同时其他人执行了数据库事务,那么读取两个不同的 EntityManager 甚至可能会给出具有不同内容的对象。但是如果通过同一个实体管理器重复读取,第二次读取只会从实体管理器缓存中获取对象,因此更新的状态将不可见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-23
      • 2014-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-26
      • 1970-01-01
      相关资源
      最近更新 更多