我使用SqlConnection
和Parallel.ForEach()
運行多線程操作,從SQL Server數據庫獲取數據和下面正在發生的TCP連接:ADO.net不打烊速度不夠快
- 我的包裹
SqlConnection
using
聲明,以便連接正確處置。 - 我的過程始終拋出
SqlException
包裹在一個AggregateException
一段時間成功運行後(「建立到SQL Server的連接時發生網絡相關的或特定於實例的錯誤。」) - 我發現,這種情況大約2^14(16384)調用數據庫(總計,跨所有線程)。
- 我啓動了perfmon,我可以看到這也是在引發異常的時候(「Connections Established」計數器)打開的TCP連接數。
- 我確信在我的代碼中沒有連接泄漏 - 我查詢數據庫的地方很少,他們都正確地處理連接(事實上,沒有其他模式用於查詢數據庫比香草
using(...)
) - 我關閉了連接池併發生相同的行爲。
- 奇怪的是,如果我在SQL Server中刪除了一個使我的查詢速度很快的索引,那麼操作會成功完成(雖然速度很慢) - 不會引發異常。我觀察到,建立的連接數線性上升到大約13K,然後穩定了一段時間,然後有一段時間線性下降,這一切都在運行時進行。
- 我的結論是,在建立索引的情況下,.net處理數據的速度比它能夠關閉連接並最終達到某種操作系統或.NET套接字最大閾值更快。如果沒有索引,.NET仍然保持着太多的連接,但是它有足夠的時間關閉它們,以便最大打開套接字閾值不被打中。
我不知道如何指示.NET關閉這些連接。我認爲當SqlConnection
被丟棄時,這種情況會自動發生。
特別奇怪的是,當連接池使用默認設置(100個連接)處於活動狀態時,該ADO可以打開更多的TCP連接 - 就好像池連接正在被拋棄一樣?!?! – SFun28