我們正在開發一個(JavaSE-)應用程序,它通過持久的tcp連接與許多客戶端進行通信。客戶端連接,執行一些/許多操作(將其更新爲SQL數據庫)並關閉與服務器的應用程序/斷開連接。我們使用Hibernate-JPA並使用ThreadLocal變量自行管理EntityManager生命週期。實際上,我們在每個客戶請求上創建一個新的EntityManager實例,目前爲止工作正常。最近我們進行了一些分析,發現hibernate在每個UPDATE語句之前對數據庫執行SELECT查詢。這是因爲我們的實體處於分離狀態,並且每個新的EntityManager都首先將實體附加到持久化上下文。當服務器處於負載下時(這是因爲我們有一個寫入重度的應用程序),我們試圖消除這種泄漏,這導致大量的SQL開銷。EntityManager生命週期和持久客戶端 - 服務器通信
- 首先,我們想到了2nd-Level-Cache。但是,我們發現,無論何時添加或刪除新項目,hibernate都會使Query-和Collection-Caches無效。
- 第二個想法是,只要客戶端在服務器上登錄,我們就評估是否保持一個EntityManager。但我不知道這是否是一個「最佳實踐」,因爲它有一些缺點:線程安全性,EntityManager實例的管理開銷等。
簡而言之:我們正在尋找一種方法來獲取在每次UPDATE之前擺脫這些SELECT語句。那裏有任何想法?
聽起來非常有益的事情。我會試試這個。 – infinikli