ADO.NET 提供者維護連線池:開啟連線 → 從池取得 → 執行查詢 → 處理結果 → 關閉/釋放回池。無池化時頻繁開關連線極耗效能。
// 危險模式
SqlConnection conn = new SqlConnection(cs);
conn.Open();
SqlCommand cmd = new SqlCommand(sql, conn);
SqlDataReader dr = cmd.ExecuteReader();
while (dr.Read()) { ... }
// 忘記 dr.Close() / conn.Close() → 連線洩漏
CommandBehavior.CloseConnection **僅在 ASP.NET 複雜繫結控制項 (GridView 等) 完整繫結時才自動關閉**while (dr.Read()) 迴圈結束**不會**觸發自動關閉dr.Close() 與 conn.Close(),或使用 using 區塊Fill/Update 前連線**已開啟**,方法結束後**不會自動關閉**PerformanceCounter pc = new PerformanceCounter(
".NET Data Provider for SqlServer",
"NumberOfActiveConnectionPools",
true); // 僅限進程內
// 其他關鍵計數器:
// NumberOfActiveConnections, NumberOfFreeConnections,
// NumberOfPooledConnections, NumberOfNonPooledConnections
.NET Data Provider for SqlServer// 故意開啟 110 條連線 (超過預設 100)
for (int i = 0; i < 110; i++) {
using (SqlConnection c = new SqlConnection(cs)) {
c.Open();
// 故意不關閉,觀察 TimeoutException
}
}
測試結果:未正確關閉時,InvalidOperationException: Timeout expired,池中留下孤立連線,重啟進程前不會釋放。
using 區塊 包裹 SqlConnection/SqlDataReader/SqlCommandMax Pool Size (依負載調整,預設 100 通常足夠)NumberOfActiveConnections > 80% MaxPoolSize 觸發預警new SqlConnection 確認皆在 using 中連線池是效能關鍵,也是隱性 Bug 溫床。以 using 確保釋放、PerfMon 監控池健康、壓測驗證極限,三管齊下才能讓應用在高併發下「游泳」而非「沉沒」。