我有一個調用org.hibernate.Query#list
的方法的性能問題。方法調用的持續時間隨着時間的推移而變化:通常持續約一秒,但有些日子可能持續半天,大約需要20秒。org.hibernate.Query#list is randomly slow
該問題如何解決?如何確定這個問題的原因?
在這個問題的分析更多的元素:
- 性能問題已經在生產環境中觀察到,但所描述的問題是在測試環境中。
- 該問題已被觀察到至少幾個星期,但其來源的日期是未知的。
- 基礎的查詢是在MS SQL服務器(2008 R2)的視圖(選擇):
- 數據庫讀取此測試環境/寫是從幾個用戶每次只能:數據庫服務器不應該過度沉重,數據只是隨着時間的推移緩慢變化。
- 直接從MS SQL Server客戶端執行準確的查詢總是需要不到一秒鐘。
- 複製數據庫(使用MS SQL Server客戶端備份數據庫並將此備份恢復爲新數據庫)不允許重現此問題:方法調用會導致重複數據快速複製。
- 應用程序使用Hibernate(4.2.x版)和Java 6.從休眠3.5
- 升級到4.2並沒有改變任何有關的問題。
- 該方法調用始終具有相同的參數:有一個測試方法可以執行該操作。
- (使用HPROF)剖析方法調用表明,當它長,大部分時間花費在「的Object.wait」和「ref.ReferenceQueue.remove」。
- 使用log4jdbc登錄方法調用期間基礎查詢的持續時間顯示出下列結果:
- 查詢< 1S =>方法〜1S
- 查詢〜3秒=>方法〜20多歲的
- 該查詢生成POJO,如this issue中最新推薦的答案中所述。
- 我沒有使用從this other similar issue中最先進的投票答案描述,因爲我不明白,會有什麼樣的影響與所有屬性的構造函數嘗試。
謝謝你的回答。你能描述一種方法來測試你所建議的原因嗎?在測試可能有問題的測試之前,可能需要衝洗所有操作? – cooltea