2011-07-10 77 views
3

我們在使用SQL Express運行並處理多個併發的基於AJAX的請求的MVC3 Web應用程序上遇到與Nhibernate有關的連接池問題。Nhibernate連接池問題

每隔一段時間(小時之間),我們開始看到它的錯誤顯示:

NHibernate.Util.ADOExceptionReporter
超時過期。在從池中獲取連接之前已超時。發生這種情況的原因可能是因爲所有連接池都在使用中,並且達到最大池大小。

然後在準備選擇TOP(@ P0)
....
發生錯誤

我們必須回收IIS應用程序池的

負荷在此之後停止引發500個錯誤。

縱觀SQL服務器,我們看到:

select * from sys.dm_exec_sessions 

...給約30會話使用標識上面51(即用戶會話)

select * from sys.dm_exec_connections 

...給周圍的相同數額

BUT

select @@connections 

...給出結果79022

這是否表明連接永不釋放?

Nhibernate會話是請求的整個生命週期。

有沒有人有這樣的經驗或可以指出我們在正確的方向嗎?

非常感謝

理查德

回答

4

你不能有更多然後32767連接到SQL Server。

@@CONNECTIONS也給了(我的粗體)

返回連接嘗試,無論成功或失敗,因爲SQL服務器上次啓動的次數。

不是當前連接

我懷疑你的池設置不正確,所以它耗盡太快。

或者您沒有正確釋放連接,並且在回收IIS後檢查SQL Server。

+0

+1關於釋放連接;檢查爲每個請求分配和釋放會話的代碼,並確保您正確地處理會話。 –

+0

@理查德:謝謝你的接受。我會對你在調查中發現的內容感興趣 – gbn

+0

我發現我必須將連接池數從100增加到200,並且此後不再有這些錯誤。因爲我相信該應用程序不應該需要這麼多,但嘿,不是完全滿意。有用。 – Richard