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

ASP.NET + SQL Server 網站卡死超時:死鎖、阻塞與連接池耗盡排查

     編輯:程式設計綜合問答

現象

局域網內發布後運行一段時間,網站卡死,刷新無效,最終報「連接超時」。

核心排查方向

  1. 數據庫層:死鎖與阻塞
    • 啟用 Trace Flag 1222 或查詢 sys.dm_os_waiting_tasks、sys.dm_tran_locks 定位死鎖。
    • 檢查長事務:SELECT * FROM sys.dm_exec_requests WHERE status='running' AND total_elapsed_time > 30000。
    • 索引缺失導致掃描鎖升級:補充覆蓋索引,縮短鎖持有時間。
  2. 應用層:連接池耗盡
    • **未正確關閉連接**:using (var conn = new SqlConnection(...)) 確保釋放。
    • 連接字符串 Max Pool Size 默認 100,高併發需調大或優化代碼減少佔用時間。
    • 異步未 await 導致連接提前歸還:await cmd.ExecuteReaderAsync()。
  3. 查詢性能:慢 SQL
    • SQL Profiler / Extended Events 捕獲高 CPU/IO 查詢。
    • 避免 N+1 查詢,使用 Include / 存儲過程批量獲取。

即時緩解措施



  



command.CommandTimeout = 60; // 秒

根治步驟

  1. 部署 SQL Server 監控腳本(如 sp_WhoIsActive、Brent Ozar First Responder Kit)定期巡檢。
  2. 在代碼中統一使用 using 模式管理 SqlConnection/SqlCommand/SqlDataReader。
  3. 為高頻表添加適當索引,避免 SELECT *。
  4. 考慮讀寫分離、緩存熱點數據 (Redis/MemoryCache)。

驗證腳本:查看當前阻塞鏈

SELECT 
    r.session_id, r.status, r.command, r.cpu_time, r.total_elapsed_time,
    r.blocking_session_id, t.text AS sql_text
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.blocking_session_id > 0 OR r.session_id IN (
    SELECT blocking_session_id FROM sys.dm_exec_requests WHERE blocking_session_id > 0
);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved