2011-12-29 66 views
0

我工作的一個Grails web應用程序Hibernate的Session範圍錯誤

該應用程序是一個非常緩慢的網絡上運行,並且正在運行的IE 6,又老又慢客戶端PC的訪問的數據庫連接是非常慢,數據庫已結束工作。所以最小化數據庫調用和數據傳遞是一個優先事項

我知道使用會話範圍並不是最佳實踐。在這種情況下,我認爲這將是最好的。考慮到我的所有網頁需要相同的對象,而這將讓他們在

獲取很多次,我把我的對象在會話範圍session.obj = obj

它正常工作與一個問題 由於該系統是如此在網頁鏈接(控制器/操作)上減慢多次點擊是可能的。

當發生這種情況我在一些情況下,得到一個錯誤 org.hibernate.HibernateException:非法嘗試集合有兩個打開的會話

這個代碼

if (!obj?.isAttached()) { 
    obj?.attach() 
} 

我有發生的錯誤關聯將對象附加到休眠會話,所以我可以懶加載相關的對象 我不想急於獲取(可能是解決方案) 我似乎錯誤是當對象被連接多次時引起的。這種情況似乎並沒有阻止這個問題。這是一種競賽狀態嗎?

我只是想知道如果任何人有一個解決這個問題,或者知道原因

謝謝

回答

2

如果你想避免在一個安全的方式往返到數據庫中,仍然代碼,而不必處理從Hibernate會話中掛載/分離對象,你應該做的就是使用Hibernate的二級緩存。這將使透明緩存經常使用的實體,它們的關聯,甚至經常執行的查詢結果。

緩存也可以更高效並使用更少的內存,因爲它將在所有用戶會話中共享。當然,這會更安全,因爲在HTTP會話中你不會有過時的實體。

肯定要走的路,國際海事組織。