現象
Web 伺服器透過內網 IP 連接資料庫伺服器,流量大時出現連線緩慢、逾時、`[DBNETLIB] SQL Server 不存在或拒絕訪問`。本機連線正常,`telnet IP 1433` 內網多數失敗,公網 IP 卻多數成功。
可能原因
- 連線池耗盡:高併發下連線池不足,新連線建立逾時。
- 鎖死/阻塞:複雜查詢長時間持有鎖,導致新查詢等待超時。
- 網路設備限制:交換器/防火牆對內網大量短連線進行限流或斷開。
- SQL Server 設定:`max worker threads`、`remote query timeout` 等參數預設值不足。
建議優化方向
- 優化查詢與索引:將複雜邏輯封裝為預存程序,分析執行計畫,建立適當索引,減少鎖持有時間。
- 調整連線池:連接字串加大 `Max Pool Size` (預設 100),確保 `using` 區塊正確釋放連線。
- 啟用連線重試:使用 `SqlConnection` 的 `ConnectRetryCount` / `ConnectRetryInterval` (ADO.NET 4.5.1+)。
- 檢查網路層:確認交換器無錯誤封包、防火牆無連線數限制、網卡無錯誤計數器增長。
- 考慮 Named Pipes:同機器或高速內網環境下,Named Pipes 協定比 TCP/IP 延遲更低、穩定性更高。
避免盲目修改伺服器設定
SQL Server 預設參數已支援大多數場景,優先從應用層(SQL 優化、連線池)著手,風險最小、效果最直接。