2012-11-18 65 views
0

我有一個多線程的C#應用​​程序,我需要每個線程都有一個活動連接。我不能使用連接池,除非有一種方法可以使用靜態連接在多線程應用程序中準確地更新/插入多個表,而不使用鎖。當連接數大約爲200時,就沒有問題。連接不會超出此範圍。但是,當我需要2200+個連接時,連接數量無限增長。問題:SQL Server 2012 + C#.NET連接數不斷增加

代碼來創建連接 -

@"Data Source=Server-3-PC\SQLSERVER2012;Initial Catalog=****;Persist Security Info=True;User ID=****;Password=****;Pooling=false"; 

我使用的檢查從SSMS的連接 -

sp_who2 
+0

爲什麼你需要從一個單一的應用程序這麼多的連接,你能更詳細地解釋你的問題? –

+0

我想你誤解了連接池如何工作。每次從池中重新分配一個連接(例如,通過創建一個「SQLConnection」的新實例),它都會被重置*。任何以前使用該連接都沒有任何狀態。 – Richard

+0

我無法使用連接池,因爲插入/更新是在同時運行的多個線程中完成的。 – Mukus

回答

0

我找到了答案。在並行循環內創建連接和關閉並不可靠。連接應始終在循環外部創建,在內部使用並在外部關閉。

謝謝大家的關注。

爲了更好地解釋這個,這個工程 -

Parallel.For(0,NumSymWatching , x => 
       { 
        String conString = @"Data Source=TEJ-HP\SQLSERVER2012;Initial Catalog=DRMinutesData;Persist Security Info=True;User ID=sa;Password=sql;Pooling=false;"; 
        SqlConnection hConnectionBars = new SqlConnection(conString); 
        hConnectionBars.Open(); 
        SqlCommand hCommandBars = new SqlCommand(); 
        hCommandBars.Connection = hConnectionBars; 

        BuildHistoricalBarData(A[x], B[x], beginFilterTimeMinutes, hCommandBars); 


        hConnectionBars.Dispose(); 
        hConnectionBars = null; 

       }); 

連接被打開,使用和關閉只是你想要的方式。但是,如果您在BuildHistoricalBarData方法內創建連接,則它將繼續增長。

這裏沒有使用pooling的原因是'A'是指向不同表的項目數組。即使它是同一個表,hCommandBars也會被更改(通過並行運行的線程),並且您不能在不使用鎖的情況下執行準確的插入/更新操作。鎖會減慢它的速度。

1

你是負責關閉打開的任何連接。無論您是否使用池化,模式都是創建連接,打開,將其用於一個或多個SqlCommands並關閉它。

關於池化,啓用池化的連接在關閉之前不會被重新使用,此時連接在重新使用之前被重置。在任何一種方法中,您仍然需要關閉連接。


對於影響使用連接池的多線程,我看不出這是相關的。 SqlConnection不是線程安全的,因此您應該將給定連接的所有權分配給單個線程,或者確保一次只有一個線程可以訪問它。無論哪種方式,只要您完成後關閉它,就不會有連接池問題。


我明白了,我不能說在2K的連接會發生什麼,但我無法想象,很多連接的開銷是健康的。考慮到你最終會被數據庫或cpu所限制,我會考慮重新考慮我的設計。也許某種緩衝或委派允許更少的連接。

例如,我有一個應用程序可以一次處理多個入站EDI文件。每個文件都有大約50k條記錄,需要在數據庫中進行更新。我沒有執行50,000個命令,每個文件只有一個連接,而是有一個讀取器產生排隊等待更新的更改。

讀者創建5000次左右更新後,隊列創建一個數據表並將其作爲參數傳遞給存儲過程。這允許一個往返,一個事務和一個連接來處理來自許多文件的5000個更新。我們從每秒200次更新到每秒17,000次更新。

+0

您的最後一段解釋了我正在嘗試做什麼。謝謝你。現在有人提出關於池的問題可以參考這個。 我確實有創建,使用,關閉模式。它的工作方式(我的連接數和db顯示是相等的)最多可以連接200個。之後,我嘗試了300或1000。當我加速到2200時,它似乎在泄漏。我在想也許它是由於活動連接的數量而與連接超時有關?我不知道。 – Mukus