Dot-Net

提高 NHibernate 性能的最佳方法是什麼?[關閉]

  • September 15, 2008

我有一個使用 NHibernate 作為其 ORM 的應用程序,有時由於它如何訪問數據而遇到性能問題。可以做哪些事情來提高 NHibernate 的性能?(請限制每個答案推荐一個)

使用 NHibernate 可能遇到的第一個也是最嚴重的性能問題是,如果您正在為您創建的每個會話創建一個新的會話工廠。每次應用程序執行只應創建一個會話工廠實例,並且所有會話都應由該工廠創建。

按照這些構想,只要有意義,您就應該繼續使用相同的會話。這將因應用程序而異,但對於大多數 Web 應用程序,建議每個請求一個會話。如果您經常丟棄會話,則不會獲得記憶體的好處。智能地使用會話記憶體可以將具有線性(或更差)查詢數的常式更改為常數,而無需做太多工作。

同樣重要的是,您要確保延遲載入對象引用。如果不是,即使是最簡單的查詢也可以載入整個對像圖。只有某些理由不這樣做,但最好從延遲載入開始並根據需要切換回來。

這給我們帶來了渴望獲取,與延遲載入相反。在遍歷對象層次結構或遍歷集合時,很容易忘記您正在執行多少查詢,並且最終會得到指數數量的查詢。可以使用 FETCH JOIN 在每個查詢的基礎上完成 Eager fetching。在極少數情況下,例如如果有一對特定的表您總是獲取連接,請考慮關閉該關係的延遲載入。

與往常一樣,SQL Profiler 是查找執行緩慢或重複執行的查詢的好方法。在我的上一份工作中,我們有一個開發功能,可以計算每個頁面請求的查詢。一個常式的大量查詢是您的常式不能很好地與 NHibernate 一起工作的最明顯的指標。如果每個常式或請求的查詢數量看起來不錯,那麼您可能需要進行數據庫調整;確保您有足夠的記憶體來在記憶體中儲存執行計劃和數據,正確索引您的數據等。

我們遇到的一個棘手的小問題是 SetParameterList()。該函式允許您輕鬆地將參數列表傳遞給查詢。NHibernate 通過為傳入的每個項目創建一個參數來實現這一點。這導致每個參數數量的不同查詢計劃。我們的執行計劃幾乎總是從記憶體中釋放出來。此外,許多參數會顯著減慢查詢速度。我們對 NHibernate 進行了自定義修改,以將項目作為分隔列表發送到單個參數中。該列表在 SQL Server 中由表值函式分隔,我們的 hack 自動插入到查詢的 IN 子句中。根據您的應用,可能還有其他類似的地雷。SQL Profiler 是找到它們的最佳方式。

引用自:https://stackoverflow.com/questions/67103