首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 更多程式設計知識

ADO 連線逾時與命令逾時完整解析:ConnectionTimeout、CommandTimeout、分頁查詢優化

     編輯:更多程式設計知識

兩大逾時屬性區別

屬性所屬物件預設值控制範圍
ConnectionTimeoutConnection (ADO) / SqlConnection.ConnectionTimeout (ADO.NET 唯讀)15 秒建立實體連線的等待上限
CommandTimeoutCommand (ADO/ADO.NET)30 秒命令執行 (含查詢、存儲過程) 的等待上限

ADO.NET 中 SqlConnection.ConnectionTimeout 唯讀,需在連接字串指定 Connect Timeout=20;SqlCommand.CommandTimeout 可讀寫,預設 30 秒。

常見逾時情境與對策

1. 連線建立逾時

// 連接字串指定
"Server=192.168.1.100;Database=MyDB;User Id=sa;Password=xxx;Connect Timeout=20;"

若伺服器負載高導致連線排隊,調大此值;但過大會阻塞呼叫執行緒,建議搭配非同步 OpenAsync。

2. 長時間查詢逾時

using (var cmd = new SqlCommand(complexSql, conn)) {
    cmd.CommandTimeout = 120; // 2 分鐘
    // 或 0 表示無限等待 (極不建議)
    using (var reader = cmd.ExecuteReader()) { ... }
}

根治之道:優化查詢 (索引、統計資料、查詢重寫)、分頁、非同步執行、快取結果。

3. ASP.NET 頁面逾時

ASP.NET 執行逾時預設 110 秒 (httpRuntime executionTimeout),若命令逾時大於此值,頁面會先拋 ThreadAbortException。需在 web.config 調整:

<httpRuntime executionTimeout="300" /> <!-- 5 分鐘 -->

分頁查詢優化 (重述核心技術)

避免 Fill(startRecord, maxRecords) 造成全表掃描,採用:

  • WHERE + ORDER BY + TOP:需唯一遞增鍵,WHERE ID > @LastId ORDER BY ID TOP @PageSize。
  • 巢狀 TOP:不需唯一鍵,SELECT TOP @PageSize * FROM (SELECT TOP @PageSize*@PageNum * FROM T ORDER BY Col) ORDER BY Col DESC。
  • OFFSET/FETCH (SQL 2012+):標準語法,效能最佳。

綜合建議

  1. 連接字串設 Connect Timeout=15~30,命令預設 30 秒,長查詢單獨調大。
  2. 監控 sys.dm_exec_requests 找出長時間執行查詢並優化。
  3. 使用 SqlCommand.ExecuteNonQueryAsync/ExecuteReaderAsync 避免阻塞執行緒。
  4. 分頁採用資料庫端分頁,減少網路傳輸與記憶體壓力。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved