我遇到了一個令人沮喪的問題,我原本以爲是連接泄漏,但似乎並非如此。該規範是這樣的:此應用程序的數據訪問使用Microsoft的企業庫(v4)。所有的數據訪問調用被包裝在使用語句,如ASP.NET SqlConnection超時問題
using (DbCommand dbCommand = db.GetStoredProcCommand("sproc"))
{
db.AddInParameter(dbCommand, "MaxReturn", DbType.Int32, MaxReturn);
...more code
}
現在這個應用程序的索引,使8個調用數據庫加載的一切,我可以通過刷新該指數約15倍使應用程序癱瘓。看來,當數據庫達到113個連接時,我收到這個錯誤。這是什麼讓這個奇怪的:
我已經運行類似的代碼與entlib在高流量的網站,並從未有過這個問題。
如果我殺了所有與數據庫的連接,並獲得生產應用程序備份和運行每次我刷新應用程序,我可以運行該SQL
SELECT DB_NAME(dbid) as 'Database Name',
COUNT(dbid) as 'Total Connections'
FROM sys.sysprocesses WITH (nolock)
WHERE dbid > 0
GROUP BY dbid
我可以看到連接的數量與每個積極加大頁面刷新。在本地框上使用相同的連接字符串運行相同的代碼不會導致此問題。此外,如果生產網站關閉,我可以通過Visual Studio啓動網站,並運行它,兩者之間的唯一區別是生產站點啓用了Windows身份驗證,而我的本地副本則沒有。關閉Windows身份驗證似乎對服務器沒有影響。
我絕對沒有線索是什麼導致這個或爲什麼連接沒有在SQL Server中處理。 EntLib對象沒有爲任何東西分解.Close()方法,所以我不能明確地關閉對象。
有什麼想法? 謝謝!
編輯
哇,我剛剛注意到,我從來沒有真正發佈錯誤消息。 Oy公司。實際的連接錯誤是:超時已過期。在從池中獲取連接之前已超時。發生這種情況的原因可能是因爲所有連接池都在使用中,並且達到最大池大小。
請提供一些「更多的代碼」。 – 2010-02-27 04:57:37
鑑於索引對存儲的procs/SELECT等進行了8次調用,每個查詢花費多少時間在數據庫中?難道這個頁面需要相當長的一段時間才能從DB獲取數據,並且如果請求了相同的頁面,它會生成一個新的連接(或從池中)並執行長時間運行的查詢? – shahkalpesh 2010-02-27 05:53:15
更多的代碼並不真正相關,因爲它可以在使用中執行讀取器或執行標量。香草的東西真的。 – dparsons 2010-02-27 15:44:17