2011-07-27 76 views
3

在Global.asax中我的Application_Start代碼需要2-3分鐘才能完成(長的數據庫查詢等)在Global.asax中慢的Application_Start使得死鎖

每當我發佈該網站的新版本,我得到aspnet_isapi.dll上的死鎖和應用程序無法啓動。

它啓動的唯一方法是當我禁用IIS從互聯網訪問,再次重新啓動應用程序&打一個電話到網站(爲了global.asax)工作。

我不明白爲什麼當應用程序啓動時獲取大量頁面/文件請求時發生死鎖。我知道Global.asax上的Application_Start只會觸發一次,我猜所有其他客戶端都會等待事件完成,所以我不認爲它有死鎖的原因。

有什麼想法?

更新:

它需要更多的像4-5分鐘...... 的代碼使數據庫查詢,並將其附加到應用程序變量(供以後使用)。 它是我的專用服務器上的虛擬服務器。只有另一臺機器不需要太多資源。 我得到事件ID 2262 - ISAPI'... \ aspnet_isapi.dll'報告自己不健康,原因如下:'檢測到死鎖'。

有一個SQL查詢需要大部分時間。我可以在不同的進程(Windows服務/等)上執行這個查詢,但問題是,我不明白爲什麼會發生.... 如果將來會發生什麼,我將不得不把一些耗時的代碼在Application_Start裏面?

+0

@Shay,也許你應該考慮在不同的線程上運行應用程序啓動代碼。 – VinayC

+0

@VinayC,問題是應用程序需要在application_start – Shay

回答

3

這種方法存在幾個問題。

首先 - 加載那麼多的數據並將其粘貼在應用程序中似乎過多。我可以在很長時間內查詢數百萬條記錄,因此我會檢查您的索引和查詢以確保這確實是必要的。你需要加載哪些數據才能進入應用程序? 還請記住,您將增加應用程序的工作內存,它在某些時候可能會導致它基於IIS工作進程設置進行重置。

Application_Start應該儘可能快地完成,因此運行時知道所有加載好的事情。我相信你的僵局並不像典型的情況那樣僵局,而是像'我認爲它卡住'的情景。

如上所述 - 一種選擇是將處理拉出到另一個線程。但是請注意,當您的應用程序閒置一段時間後,它將被關閉。您可以在IIS中更改這些設置,但我真的會考慮重新考慮這種數據加載。爲什麼不從數據庫查詢需求?您可以創建一個新的索引視圖與數據庫端的數據(其他建議)

+0

中啓動並填充的變量,我加載的大部分數據都是靜態數據,所以我不必每次都查詢數據庫。實際上,我可以更好地爲表格編制索引,但對於我正在使用的這個特定查詢(在幾天內只需要發生一次)我不認爲索引是一件好事。隨着此特定表格的增長,它可能會降低性能。我也可能在這裏是錯誤的;;)我想我會創建一個工作來運行這個查詢一段時間,而不是把它放在application_start裏面。 – Shay

+0

唯一的問題就是爲什麼會發生這種情況......我不認爲這是第一次加載應用程序時發生「我認爲它卡住了」的情況,並且只對它發出一個請求(對於application_start提高),一切都很好。也許它是某種方式的隊列限制?如果是這樣,爲什麼它是一個僵局,而不是一個正常的例外? – Shay

+0

如果所有數據準備了一兩天,那麼數據庫進程如何填充登臺表? –

相關問題