2011-11-06 82 views
0

我正在運行一個網站使用ASP.NET和NHibernate。最近該網站已經遇到了一個導致SQL Server超時問題的問題。我發現這個問題與鎖定數據庫中的表的NHibernate查詢有關。該網站將在20分鐘後恢復,或者如果我手動強制數據庫上的所有連接結束。ASP.NET NHibernate C#超時問題SQL Server

基本上我一直在試圖找出哪個查詢導致了這個問題,但不幸的是,在使用NHibernate profiler嘗試查找查詢幾個月後,我沒有成功。這個問題很少發生,通常每週只有1-2次,這使得更難確定導致查詢鎖定表的原因。我有.net安裝程序在發生錯誤日誌時向我發送錯誤日誌,這有助於避免在查詢運行時網站被鎖定,因爲我能夠強制所有SQL連接斷開,然後恢復站點。

長話短說,我需要的是一個創可貼的解決方案,當我繼續嘗試查找錯誤的查詢時,它將臨時爲該網站工作。我想要做的是將超時時間從20分鐘改爲2-5分鐘。這樣就限制了這個錯誤查詢運行時網站停機的時間。考慮到糟糕的查詢只發生在每週1-2次,我認爲這將是有限的停機時間。

唯一的問題是我不知道這是SQL Server強加的東西,還是這是.net或NHibernate強加的東西。基本上我所指的是在運行錯誤查詢後連接最終被丟棄的20分鐘。任何人都知道這20分鐘是什麼,它可以在哪裏設置?我傾向於這可能是某種NHibernate超時,但我不知道如何設置它。

回答

2

20分鐘的唯一一件事是站點運行的應用程序池上的空閒超時設置。因此,在閒置20分鐘後,IIS將重新啓動整個工作進程,並且所有工作都會再次運行。因此,您可以將應用程序池上的此設置更改爲2-5分鐘。

現在,從您所說的話看來,您似乎沒有正確地處置事務,並且它一直運行到超時。因此,您需要做些什麼來確定將哪些代碼附加到調試器到IIS網站,並查看線程以查看它們卡在哪裏。

This有點高級,但如果你遵循,你將能夠看到什麼是鎖定你的數據庫。如果你在IIS服務器上安裝了visual studio,那麼調試環境會更加熟悉,這會更容易。

+0

如果我正在緩存映射到數據庫中的表的域對象,會發生這種情況嗎?我正在考慮這個問題,當我第一次開始時發生的重大變化是將一個站點對象存儲在緩存中,因此它不必返回到表中來檢索它。但是,這可以以某種方式阻止它處理交易嗎? – matwonk

+0

首先,你使用NHibernate的事務嗎?如果是,請確保它在使用說明中,或者正確處理它們。每個Session.BeginTransaction()都必須有相應的Dispose()。我猜如果你發佈一些代碼會很有用。你在哪裏打開你的會議?它是在BeginRequest事件背後還是代碼? –