2009-07-20 68 views
14

我有一些運行在SQL 2000數據庫後端服務器上的ASP.Net網站(.Net v3.5)。幾個月來,我一直在收到看似隨機的InvalidOperationExceptions消息,內容爲「內部連接致命錯誤」。有時候會有幾天的時間,而其他時間每天都有很多錯誤。什麼導致「內部連接致命錯誤」

雖然它們共享業務和數據訪問程序集,但異常並不侷限於特定的一個站點。該錯誤似乎總是從SqlClient.TdsParser.Run()中拋出。它有時是從老派的直接SqlCommand.Execute()調用拋出的,有時則是從Linq2Sql代碼拋出。

我一直向網絡工作人員保證,在它們的末端沒有錯誤或數據包丟失。有沒有其他人經歷過這個?它可能是一個驅動程序問題?我們一直未能確定這一例外的具體觸發因素。

我們在Windows Server上運行II6 2003

回答

21

經過幾個月的忽視這個問題,隨着交通量逐漸增加,它開始達到臨界質量。在重負載下,包括一些爬蟲,事情變得瘋狂,這些錯誤不停地涌入。

通過試驗和錯誤,我們最終追蹤了一些SqlCommand或LINQ查詢,其SqlConnection在使用後沒有立即關閉。相反,通過一些源於對LINQ連接誤解的拙劣編程,DataContext對象僅在請求結束時才被處理(並關閉連接),而不是立即處理。

一旦我們重構這些方法立即關閉與C#「using」塊的連接(爲下一個請求釋放該池),我們不會再收到任何錯誤。雖然我們仍然不知道連接池會混淆的根本原因,但我們能夠停止所有類型的錯誤。這個問題與我發佈的另一個類似錯誤一起解決,發現在這裏:Why is my SqlCommand returning a string when it should be an int?

1

檢查服務器的日誌文件夾(\ Program Files文件\ Microsoft SQL Server的\ MSSQL.1 \ MSSQL \ LOG或類似)爲命名的文件SqlDump * .mdmp和SqlDump * .TXT。如果您確實發現任何問題,您必須將其提交給產品支持部門。

1

聲音像數據庫連接正在下降或超時。

我們最近有類似的問題從IIS 5連接到SQL 2000遷移到IIS 6.我們的問題已通過增加可用的臨時端口數量來解決。

查看IIS服務器對臨時端口的使用情況。默認最大數量的可用端口通常爲4000.如果服務器上的站點特別繁忙或者您的應用程序正在進行大量數據庫調用,則可能需要考慮增加此端口。

您可以先監控這些是否超過最大限制。

搜索「MaxUserPort」和「TcpTimedWaitDelay」的Microsoft知識庫並進行必要的註冊表更改。確保在進行更改之前備份註冊表或快照服務器。將需要重新啓動才能使更改生效。

你應該仔細檢查你的數據庫和記錄集連接是否在使用後關閉。不關閉會不必要地使用這個端口範圍。

無論如何檢查存儲過程的效率,因爲他們可能需要的時間比他們需要的還要長。

「如果在不到四分鐘內快速打開並關閉4000個套接字,您將達到客戶端匿名端口的默認最大設置,並且新的套接字連接嘗試失敗,直到現有的一組TIME_WAIT套接字超時。 - 從http://support.microsoft.com/kb/328476