1

我有一个简单的 Java 应用程序,它将记录插入表“A”,通过读取适当的“B”记录将它们链接到另一个表“B”中的记录,在“A”中设置引用,并保存“A”记录。我遇到的问题是,Hibernate 显然保留了它在链接过程中读取的每个“B”记录,这最终导致程序内存不足(堆空间错误)。

我查看了带有 JHAT 的堆转储,这是有问题的类。前三名都是 Hibernate 的东西,第四名是我的 Hibernate/JPA 托管实体类。当它尝试实例化 GeoEntity 的另一个实例时,会发生内存不足错误,即我的“B”表实体:

134489 instances of class org.hibernate.engine.spi.EntityKey 
67245 instances of class org.hibernate.engine.spi.EntityEntry 
67245 instances of class org.hibernate.internal.util.collections.IdentityMap$IdentityKey 
67244 instances of class com.electricgearbox.model.GeoEntity 

我已经浏览了我的代码,我很确定我没有做任何事情,比如设置引用然后从不清除它们。事实上,我在循环结束时将我使用的两个本地引用显式设置为 null。

那么,有人遇到过这种情况吗?我确定这是缺少代码行或我忘记了设置,但谷歌搜索和阅读 Hibernate 文档并没有提供明显的解决方案。是什么让 Hibernate 无缘无故地持有这些引用?

4

1 回答 1

5

所有这些都缓存在 Session / EntityManager 后面。如果您使用 Hibernate Session,则可以使用以下内容:

  • evict从会话中删除单个实体
  • clear清除所有实例。如果程序逻辑中有这样一个点,即不需要会话中的任何实体。

或者他们在 EntityManager 中的对应物,如果再次开发 JPA API:

于 2012-05-13T16:54:44.960 回答