2012-05-13 18 views
1

我有一個簡單的Java應用程序,它將記錄插入到表「A」中,將它們鏈接到另一個表中的記錄,「B」通過讀取適當的「B」記錄,在「A」中設置引用並保存「一個記錄。我遇到的問題是,Hibernate顯然會在鏈接過程中讀取每個「B」記錄,最終導致程序運行內存不足(堆空間錯誤)。讓Hibernate在使用它們時釋放實體實例?

我看着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。

那麼,有沒有人遇到過這個?我確定這是缺少的代碼行或我忘記的設置,但Google和Google閱讀Hibernate文檔沒有提供明顯的解決方案。如果沒有明顯的原因,Hibernate會保留這些引用嗎?

回答

4

所有這些緩存在Session/EntityManager後面。如果你使用Hibernate的Session,您可以使用下列內容:

  • evict從會議中刪除單個實體
  • clear清楚所有實例。如果程序邏輯中有這樣一個點,那麼不需要會話中的任何實體。

或它們在EntityManager的同行,如果開發agains JPA API:

+0

這是問題可用。我用EntityManager.flush()混淆了EntityManager.clear()。 – user1071914

相關問題