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

Java 我应该经常调用EntityManager.clear()以避免内存泄漏吗?,java,jpa,memory-leaks,openjpa,entitymanager,Java,Jpa,Memory Leaks,Openjpa,Entitymanager,我是JPA/OpenJPA新手,我注意到如果我在持久化实体后不调用EntityManager.clear(),我会得到OutOfMemoryError(我在循环中不断添加新实体)。我不确定这是预期的行为,还是只是OpenJPA1.2.1的小故障 那么,我是否需要自己明确地分离实体? 如果我不是,这是一个很好的做法?我没有太多的JPA经验。但是,这将非常有用- 在JPA中,您必须: -为每个事务创建一个新的EntityManager。 -在每个事务后调用clear()以清除持久性上下文。取决于您将

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

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

我没有太多的JPA经验。但是,这将非常有用-
在JPA中,您必须: -为每个事务创建一个新的EntityManager。

-在每个事务后调用clear()以清除持久性上下文。

取决于您将多少对象带入持久性过程(读取)。如果您处理大的数字(或者某些对象很大),那么使用clear()是有意义的。每次读取对象时,JPA impl都应该将其放入一级缓存。

听起来您的设计中有什么地方出错了。通常,一旦实体超出实体管理器的范围,它就会被分离。这也是您不能在范围之外延迟加载关系的原因之一


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

当你说实体被分离时,它不在实体管理器的范围内,你的意思是我应该关闭实体管理器,并像Padmarag建议的那样为每个事务创建一个新的实体管理器吗?谢谢。好的,根据答案中的提示,我发现我不应该在应用程序中只使用一个长寿命的EntityManager。我应该使用方法范围或请求范围[1]。这样就不需要调用em.clear()。谢谢[1] 有用的链接。我在依赖注入中使用了JPA(使用Seam),所以没有遇到类似的问题。这是错误的,你不应该在每个事务中清除em。如果你每次都这样做,你就不会利用他们。