2013-08-07 84 views
2

當我運行這個代碼時,到我的DB的連接數在connection.Open()後增加到3。爲什麼在connection.Close()後不能回到2?爲什麼在連接上調用dispose後連接數量不會減少?

private static void AdoNetStuff() 
{ 
    var connection = new SqlConnection(@"Initial Catalog=abook;server=.\SqlExpress;Integrated Security=true"); 
    var sqlCommand = new SqlCommand("SELECT TOP 10 * FROM dbo.Entity", connection); 

    connection.Open(); 

    sqlCommand.ExecuteReader(); 

    sqlCommand.Dispose(); 
    connection.Dispose(); 
    connection.Close(); 
} 

上面的代碼是在一個控制檯應用程序,和連接的數量不下降回落到2,直到我的控制檯應用程序關閉。

這是我如何檢查連接數。

SELECT DB_NAME(dbid) as DBName, COUNT(dbid) as NumberOfConnections, loginame as LoginName 
FROM sys.sysprocesses 
WHERE dbid > 0 AND DB_NAME(dbid) = 'abook' 
GROUP BY dbid, loginame 

我可以等一會兒才能結束控制檯應用程序,我仍然有3個連接。一旦我結束應用程序,連接數就會回落到2.

+2

附註:開始使用'using'進行自動處理 – zerkms

+0

@zerkms謝謝。我其實知道這一點。我已經繼承了一個應用程序,它可以在任何地方使用上述場景,而不需要進行任何處理。我們正在排除故障,並試圖更好地瞭解在這種特殊情況下發生的事情。 –

+0

可能的重複http://stackoverflow.com/questions/6043069/closing-sql-connection-but-open-connections-keeps-incrementing –

回答

4

由於性能原因,SQL Server使用連接池。這意味着即使通過您稱之爲處置,您的連接仍會保持活動狀態。

嘗試撥打電話: SQLConnection.ClearAllPools();

+1

來自http://msdn.microsoft.com/en-us/library/8xx3tyca(v=vs.100).aspx:'當應用程序在連接上調用Close時,池會將其返回到活動連接的池集而不是關閉它。「好吧,那爲什麼它仍然是開放的,這是有道理的。但爲什麼關閉應用程序後連接數量下降?爲什麼沒有這個連接保持打開狀態,並且在遊戲池中,甚至在應用程序關閉之後呢? –

+0

連接池通常發生在每個進程(或每個AppDomain)的基礎上。全系統連接池並不是真正的事情。 –

+0

我相信這個池是數據庫提供者的一部分。這意味着它被烘焙成你的應用程序使用的dll參考。應用程序關閉,dll會隨着連接一起消失。然而,我可能錯了。 – tHand

0

看起來你是在關閉之前處理 - .Dispose應該是在將對象變量設置爲Nothing

通過在關閉它之前處理命令和/或連接,您可能會斷開連接。

也許你可以使用Using塊爲您的connectionsqlCommand

+0

我試着先調用'Close()',但我仍然遇到同樣的問題。我知道'使用'。看到我對上面的評論。謝謝。 –