2012-03-06 51 views
2

大家都知道,Hibernate的引入開銷基本在數據庫中的所有操作,由於內部緩存的管理和對象的狀態。提高性能取與Hibernate

我們目前在我們的應用程序,我們使用普通的SQL(JDBC),並使用Hibernate來保存和更新讀取數據。原因是我們需要在每次計算過程中加載大量信息,但只更新有限的部分。現在

,我們知道這種方法是不是真的乾淨,我們做了一些測試,我們試圖微調Hibernate的閱讀,但我們所取得的成就是以下幾點:

讀寫時間JDBC(session.doWork) :23號第
讀取時間休眠(session.createQuery懶獲取):94號

在我們看來,現有的開銷是由於Hibernate的額外的處理,我們想知道,如果在並行讀取本身可能是有幫助(我們正在閱讀很多我們可以並行執行的表格)? Hibernate的會話和事務是否被設計爲安全地從多個線程使用?

此外,如果您有任何其他的想法,有什麼可以幫助加快這一準備就緒,我們將感謝。

回答

4

如果並行化讀取本身可能有任何幫助(我們正在閱讀很多表,我們可以並行)?

這取決於。如果你的數據庫是羣集或不同的表駐留在位於不同的物理磁盤或機器不同的表空間,並行化可能會加速事情。否則,I/O是瓶頸。

另外,還要確保你的查詢被編譯一次,重複使用,在數據庫服務器解析/編譯階段可能需要一些時間(但由於這部分是CPU限制的其實是可以成功進行並行)。

Hibernate的會話和事務是否被設計爲安全地從多個線程使用?

絕對不是。 Hibernate中的會話和事務本質上綁定到數據庫連接。連接是單線程的。

此外,如果您有任何其他想法,有什麼可以幫助加快這一準備,我們會感激。

  • 使用預處理語句/編譯查詢,以避免編譯開銷在DBMS

  • 實驗L2和查詢緩存在Hibernate中

  • 請確保您連接池的配置是否正確

  • 監控GC活動和memomry消費,也許你的Hibernate Session被增長過大?

  • 考慮存儲過程,他們往往是在快速的答案快得多

+0

謝謝,但它接縫,我們已經嘗試了一切,現在我們仍堅持這一4X開銷。 – mario 2012-03-06 12:27:09

+0

@mario:你有沒有嘗試過分析?但老實說,原始JDBC中的23秒意味着你正在做很多查詢,不要指望Hibernate在所有反射/ HQL開銷(可能是標準API)或者[批處理](http:// docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html))另外,Hibernate並不是最快的JPA提供者:http://www.jpab.org – 2012-03-06 12:30:51

+0

我們正在閱讀很多數據,但只有很少的查詢。我的直覺告訴我預計會有2-5倍的開銷,我們的成就(4倍)符合預期。我會檢查jpab(到目前爲止還沒有聽說過)。謝謝! – mario 2012-03-06 12:42:27