2014-01-31 20 views
0

我有一個調用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中最先進的投票答案描述,因爲我不明白,會有什麼樣的影響與所有屬性的構造函數嘗試。

回答

0

隨着Hibernate查詢顯然隨機緩慢的一個可能的原因是會話的刷新。如果同一事務中的某些語句(插入,更新,刪除)未刷新,Query的列表方法可能會執行自動刷新(取決於當前刷新模式)。如果是這種情況,性能問題甚至可能不是由調用list()的查詢造成的。

+0

謝謝你的回答。你能描述一種方法來測試你所建議的原因嗎?在測試可能有問題的測試之前,可能需要衝洗所有操作? – cooltea

0

看來問題是與MS SQL Server和程序的計劃的更新:下列DBCC FREEPROCCACHE,DBCC DROPCLEANBUFFERS查詢和方法的時間是一致的。

有解決的問題可能升級的MS SQL Server:升級到MS SQL Server 2008 R2的SP2導致問題沒有出現了。

看來查詢的時間和方法之間的區別是返回相關對象的指數因子:大部分的時間都花在閱讀的結果集的插座上。

+0

原始問題可能是以下內容的副本:http://stackoverflow.com/q/642093 – cooltea