SQL Server 連線共用的問題

在預設的情況下,SQL Server 的 .NET Framework 資料提供者會自動提供連線共用(Connection Pooling),以利提升應用程式的延展性及效能。然而,當 ADO.NET 用戶端嘗試使用共用連線時,有可能會遇到如下的例外狀況:
在傳送要求至伺服器時發生傳輸層級的錯誤。 (provider: TCP 提供者, error: 0 - 遠端主機已強制關閉一個現存的連線。)

A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.)

如果共用連線集區的可用連線與伺服器的連接已嚴重損毀,例如:伺服器重新啟動、容錯移轉、使用者處理序被刪除等,連線共用器並無法立即發現異常,直到將其傳回至 ADO.NET 呼叫端並嘗試與伺服器進行通訊後,才會偵測到連接已損毀。當發生此情況時,連線共用器會從集區中移除該連線,並且擲回如上的例外狀況。

連線共用機制並非能完全保證可用連線的有效性,除非你在連線字串中指定 Pooling=false 明確停用,否則你難以避免此類問題發生。除此之外,建議你在資料存取程式碼中加入例外處理常式因應,或是使用 Retryer Pattern 做最佳的容錯處理。

參考資料:
SQL Server 連接共用 (ADO.NET)


Share/Save/Bookmark

0 comments :: SQL Server 連線共用的問題

張貼留言