2013-03-21 117 views
8

我一直在爲這個問題找到矛盾的結果。讓我們來看看運行的SQL查詢的這個C#代碼:我是否需要使用關鍵字關閉SQL Server連接?

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    cn.Open(); 

    using (SqlCommand cmd = new SqlCommand(strSQL, cn)) 
    { 
     cmd.ExecuteNonQuery(); 
    } 

    //Do I need to call? 
    cn.Close(); 
} 

我需要調用最後cn.Close()?我問的原因是,在流量很大的Web應用程序中,我在游泳池中連接不足。

回答

10

此處所用的using關鍵字:

using (SqlConnection cn = new SqlConnection(strConnectString)) 
{ 
    // Stuff 
} 

是短期的:

SqlConnection cn = null; 
try 
{ 
    cn = new SqlConnection(strConnectString); 
    // Stuff 
} 
finally 
{ 
    if (cn != null) cn.Dispose(); 
} 

cn.Dispose()將被稱爲cn後立即熄滅的using的範圍,這反過來又立即關閉連接(因爲SqlConnection.Dispose()就是這樣做的)。

UPDATE

這不應該與垃圾回收相混淆。 GC在GC中是非確定性的。NET,這正是爲什麼引入IDisposable接口和Dispose PatternIDisposable允許以及時,確定的方式釋放昂貴的資源。

1

當您使用Using語句時,您不需要關閉連接。

Scott hanselman在這裏解釋它Why The Using Statement Is Better Than A Sharp Stick In The Eye And A SqlConnection Refactoring Example

在交通繁忙的Web應用程序中,我用完游泳池中的連接。

確保您使用相同的連接字符串,這樣SQL將使用連接池。

是連接立即關閉,或者是它閉合時垃圾 集電極到達它

編輯:

的Dispose模式用於提供資源的確定性破壞。由於.net運行時垃圾收集器是非確定性的(這意味着您無法確定運行時何時會收集舊對象並調用它們的終結器)。因此,當您正確實施Dispose模式時,您會提供確定性的資源釋放,並且在消費者不小心並且不處理該對象的情況下,終結器將清理該對象。

+0

謝謝。問題是 - 連接是立即關閉還是在垃圾回收器到達時關閉?因爲這對我的情況有所影響。 – c00000fd 2013-03-21 02:34:54

+0

「確保你使用的連接字符串相同」 - 你是什麼意思?將'SqlConnection cn'定義爲一個靜態變量? – c00000fd 2013-03-21 02:37:18

+1

'它非確定性finalisation' = **錯誤**。在'using'語句的作用域之後,連接立即被*處理。這與垃圾收集無關。事實上,非確定性GC正是爲什麼將IDisposable接口和Dispose模式引入.NET的原因。 – 2013-03-21 02:39:45

1

如果您使用using,則無需關閉它,因爲它在內部調用Displose()

這裏有關於ADO.NET中關鍵字using的一些細節,可能值得一讀。

Leveraging the "using" keyword in C#

快速搜索@SO會導致你this post,在那裏你可以在那裏找到答案了。