11

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

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

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

4

2 回答 2

12

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

于 2013-04-22T13:02:04.440 回答
2

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

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

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

于 2017-11-10T09:16:43.457 回答