| 屬性 | 所屬物件 | 預設值 | 控制範圍 |
|---|---|---|---|
ConnectionTimeout | Connection (ADO) / SqlConnection.ConnectionTimeout (ADO.NET 唯讀) | 15 秒 | 建立實體連線的等待上限 |
CommandTimeout | Command (ADO/ADO.NET) | 30 秒 | 命令執行 (含查詢、存儲過程) 的等待上限 |
ADO.NET 中 SqlConnection.ConnectionTimeout 唯讀,需在連接字串指定 Connect Timeout=20;SqlCommand.CommandTimeout 可讀寫,預設 30 秒。
// 連接字串指定
"Server=192.168.1.100;Database=MyDB;User Id=sa;Password=xxx;Connect Timeout=20;"
若伺服器負載高導致連線排隊,調大此值;但過大會阻塞呼叫執行緒,建議搭配非同步 OpenAsync。
using (var cmd = new SqlCommand(complexSql, conn)) {
cmd.CommandTimeout = 120; // 2 分鐘
// 或 0 表示無限等待 (極不建議)
using (var reader = cmd.ExecuteReader()) { ... }
}
根治之道:優化查詢 (索引、統計資料、查詢重寫)、分頁、非同步執行、快取結果。
ASP.NET 執行逾時預設 110 秒 (httpRuntime executionTimeout),若命令逾時大於此值,頁面會先拋 ThreadAbortException。需在 web.config 調整:
<httpRuntime executionTimeout="300" /> <!-- 5 分鐘 -->
避免 Fill(startRecord, maxRecords) 造成全表掃描,採用:
WHERE ID > @LastId ORDER BY ID TOP @PageSize。SELECT TOP @PageSize * FROM (SELECT TOP @PageSize*@PageNum * FROM T ORDER BY Col) ORDER BY Col DESC。Connect Timeout=15~30,命令預設 30 秒,長查詢單獨調大。sys.dm_exec_requests 找出長時間執行查詢並優化。SqlCommand.ExecuteNonQueryAsync/ExecuteReaderAsync 避免阻塞執行緒。