我应该经常调用EntityManager.clear()来避免内存泄漏吗?

时间:2010-02-11 09:49:14

标签: java jpa memory-leaks openjpa entitymanager

我是JPA / OpenJPA的新手,我注意到如果我在持久化实体后没有调用EntityManager.clear(),我会得到一个OutOfMemoryError(我不断在循环中添加新实体)。我不确定这是否是预期的行为,或者只是OpenJPA 1.2.1故障。

那么,我是否需要自己明确分离实体? 如果我不是,那么这是一个很好的做法吗?

3 个答案:

答案 0 :(得分:5)

我对JPA没有多少经验。然而,这将是有用的 -
在JPA中你必须:
- 为每笔交易创建一个新的EntityManager - 在每次事务之后调用clear()以清除持久性上下文。

答案 1 :(得分:5)

取决于您为持久性进程(读取)带来多少对象。如果处理大数(或某些对象很大),那么使用clear()可能有意义。每次读取一个对象时,它都应该由JPA impl。

放入L1缓存中

答案 2 :(得分:3)

在您的设计中,某些地方听起来有些不对劲。通常,一旦实体超出实体管理器的范围,实体就会分离。这就是你不能懒惰加载关系的原因之一,超出范围。

就我的经验而言,我很少使用em.clear(),如果有的话。我使用了Hibernate实现和Toplink Essentials。没有使用OpenJPA的经验。