Asp.net

ASP.NET MVC 中的 NHibernate 事務管理 - 應該如何完成?

  • February 25, 2013

我正在編寫一個簡單的 ASP.NET MVC,使用每個請求的會話和每個請求的事務模式(自定義 HttpModule)。它似乎工作正常,但是.. 性能很糟糕(一個簡單的頁面載入約 7 秒)。對於每個 http 請求,都會創建包含(站點上的所有圖像)的圖形資源,並且這似乎會延遲載入時間(每個圖像的事務載入時間約為 1-10 毫秒,而事務超過 1 秒) . 在 ASP.NET MVC + NH 堆棧中管理事務的正確方法是什麼?

當我將所有事務放入我的儲存庫方法時,由於一些模糊的原因,我在 NHProf 中收到“隱式事務”警告(SQL 語句在事務之外執行,即使在程式碼 session.Save()/Update()/etc 方法中也是如此在事務“使用”範圍內和 transaction.Commit() 呼叫之前呼叫)順便說一句,隱式事務真的很糟糕嗎?

當您不將語句放在事務中時,就會發生隱式事務。隱含的意思是,如果您不明確聲明事務,則每個語句都在其自己的事務中執行。所以是的,這很糟糕。那不好?我不知道你在做什麼來判斷。

我對每個請求的會話做同樣的事情,但我沒有得到接近相同的性能數字。我建議考慮為 NHibernate 打開 log4net 並查看它在做什麼。您的應用程序應該只創建一次會話工廠和代理工廠(管理會話工廠將是我使用單例的少數幾個地方之一)。這真的是我能想到的唯一可能導致它的事情。

這裡有幾個問題:

首先,關於您的性能問題。您是否確保 ISessionFactory 僅實例化一次?這是一個創建起來非常昂貴的對象,因此它可能應該是在 Application_Start 上創建的 Web 應用程序中的單例,而不是在 Application_BeginRequest 中創建的。我對為什麼性能如此差的猜測是,您正在為每個請求創建一個新的 ISessionFactory,而不是為整個應用程序創建一次。

其次,關於隱式事務,它們並沒有那麼糟糕,但是從您描述程式碼的方式來看,您不應該遇到這些錯誤。您確定要在事務中執行呼叫嗎?您可能正在訪問可能在事務之外執行的 .aspx 和 .ascx 頁面中的一些延遲載入屬性。

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