我們正在(緩慢地)將一個應用程序(使用經典的ADO.NET DAL)移動到NHibernate(遵循「每會話請求模式」和「存儲庫模式」)。做NHibernate的事務減慢其他ADO.NET連接?
的應用,現在,是在混合狀態(我知道,這是horrorful):
一些查詢被一次性DAO對象(即打開它們的構造函數的連接,並配置它在製造他們的Dispose()方法);
某些查詢是由強類型存儲庫(其Get(),Save(),Update()和Delete()方法始終啓動一個新事務 - 遵循此建議http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions或加入現有事務)。
...和由DAO對象所做的查詢非常慢(比以前慢兩倍)。
我們以前有一個數據庫鎖定問題(請參閱Isn't NHibernate's "one session per request" pattern a bit dangerous for long web requests?),我們解決了它只在需要時纔打開多個事務,並儘快關閉它們(不僅在當前Web請求結束時)。所以,現在,我們的NHIbernate實現遵循「每請求一個會話」模式,但是採用「每次請求多個事務」。
但速度問題依然存在。實現與以前相同速度的唯一方法是完全禁用NHibernate事務。
您認爲可能是什麼原因? NHibernate事務不與舊的ADO.NET連接共享?我們應該做什麼?
是否認爲將NHibernate打開的事務附加到DAO的連接可以解決問題?或者同一個事務中的查詢也放慢了? – Notoriousxl 2010-09-08 18:43:29
沒有交易應該處理特定的一套操作並保持一致性。如果這不會引起均衡問題,請嘗試將小批量的大型交易分拆。 – 2010-09-08 19:52:58
據我所見,從性能分析器(我沒有編寫應用程序,也沒有在「NHibernate開關」中進行分析),交易量非常小,只能在存儲庫的方法中使用,而這些方法非常少。 ..所以這個錯誤很難找到:(我正在使用NHProf和SQL服務器分析器 - 我是一個「DB-noob」 - ......也許我使用了錯誤的調試工具來檢查未關閉的事務) – Notoriousxl 2010-09-08 20:15:38