2010-02-11 78 views
8

我是新来的JPA/OpenJPA中,我发现,如果我不叫EntityManager.clear()后,我坚持我的实体(在一个循环中我不断添加新的实体)得到OutOfMemoryError。我不确定这是否是预期的行为,或者它只是OpenJPA 1.2.1故障。我是否应该经常调用EntityManager.clear()来避免内存泄漏?

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

回答

6

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

+0

谢谢。好的,在答案中的提示中,我发现我不应该在应用程序中只使用一个长寿命的EntityManager。我应该使用方法范围或请求范围[1]。这将消除调用em.clear()的需要。谢谢! [1] http://javanotepad.blogspot.com/2007/08/managing-jpa-entitymanager-lifecycle.html – ecerulm 2010-02-11 11:55:41

+0

有用的链接。我曾使用JPA与依赖注入(使用Seam),所以没有面临类似的问题。 – Padmarag 2010-02-11 12:23:11

5

取决于你有多少个对象带入持续的过程(读)。如果你处理大量数据(或者一些对象很大),那么使用clear()就可以了。每次读取对象时,都应该通过JPA impl将其放入L1缓存中。

3

听起来好像你的设计中某处出了问题。通常,实体一旦超出实体经理的范围就会被分离。这就是你不能延迟加载关系的原因之一,超出了范围。

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

+0

当你说实体被分离出一个超出实体管理器的范围时,你的意思是我应该关闭EntityManager并为Padmarag建议的每个事务创建一个新的实体管理器? – ecerulm 2010-02-11 11:44:50