2010-09-08 59 views
2

我們正在(緩慢地)將一個應用程序(使用經典的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連接共享?我們應該做什麼?

回答

1

是交易(持續一段時間)可以鎖定數據庫上的資源。並因此減慢其他操作。

您的交易應儘可能最小。

如果不可行,請更改隔離模式。 http://en.wikipedia.org/wiki/Isolation_(database_systems)

+0

是否認爲將NHibernate打開的事務附加到DAO的連接可以解決問題?或者同一個事務中的查詢也放慢了? – Notoriousxl 2010-09-08 18:43:29

+0

沒有交易應該處理特定的一套操作並保持一致性。如果這不會引起均衡問題,請嘗試將小批量的大型交易分拆。 – 2010-09-08 19:52:58

+0

據我所見,從性能分析器(我沒有編寫應用程序,也沒有在「NHibernate開關」中進行分析),交易量非常小,只能在存儲庫的方法中使用,而這些方法非常少。 ..所以這個錯誤很難找到:(我正在使用NHProf和SQL服務器分析器 - 我是一個「DB-noob」 - ......也許我使用了錯誤的調試工具來檢查未關閉的事務) – Notoriousxl 2010-09-08 20:15:38