2011-04-21 88 views
2

Hibernate有時會在我身上拋出這個錯誤:org.hibernate.LazyInitializationException:無法初始化代理 - 沒有會話。片狀Hibernate會話?

現在:我知道,我知道,這意味着我正在操作的實體已脫離會話,因此它無法初始化任何延遲加載的屬性。但是,問題不是100%可重現的。它不會發生在新部署,所以我們通過重新啓動受感染的服務器來解決問題(至少在一段時間內)。

我們確實啓用了內存中緩存,但我無法弄清楚緩存如何與延遲加載相互作用導致此問題。此外,爲什麼我們從來不會在新服務器上看到這個問題,而只能在已經存在一段時間的服務器上看到此問題?

+0

內存中是否緩存了hibernate緩存或類似第三方實現的內容? – brainimus 2011-04-21 21:04:48

+0

這是ehcache與hibernate的緩存界面。 – Denise 2011-04-21 21:29:47

+0

你有沒有找到解決辦法?我遇到了與您所描述的相同的問題 – 2012-04-26 20:43:02

回答

0

像這樣的LazyInitializationException通常在您使用舊的過時休眠會話中的對象時引發。說,例如,你有兩個要求:

Object o = null; 

Request 1: 
Session s1 = ...; 
o = s1.get(MyObject.class, myId); 
s1.close(); 

Request 2: 
o.getFoo().getBar(); //May throw a lazyinit exception 

這裏如果o.foo.bar不是在請求1.你需要修復您的代碼,以便請求2得到一個新的會話加載的LazyInitializationException異常將被拋出,以及對象的新副本。追蹤這類問題可能會非常棘手;檢查請求之間持有的對象,當沒有請求正在處理時(我發現jvisualvm或jprobe可以是一個福音)。通常問題的根源不明顯;例如,匿名類可以引發一個引用。

+0

該請求發生在Web服務方法中,因此我們並沒有在請求之間保留任何內容。每個請求應該是獨立的並且相同。 – Denise 2011-04-21 21:31:36

+0

我想有可能是第二級緩存有一些錯誤;但是,我認爲這是您的應用程序無意中持有某種東西(或提前關閉會話),直到您可以證明其他情況。什麼是堆棧跟蹤看起來像? – RMorrisey 2011-04-21 21:45:36

+0

哦,我希望它在我的應用程序的某個地方!這意味着我可以修復它;-) – Denise 2011-04-21 21:55:11