我是否需要使用关键字关闭SQL Server连接?

问题描述:

我一直在为这个问题找到矛盾的结果。让我们来看看运行的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应用程序中,我在游泳池中连接不足。

此处所用的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允许以及时,确定的方式释放昂贵的资源。

当您使用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

如果您使用using,则无需关闭它,因为它在内部调用Displose()

这里有关于ADO.NET中关键字using的一些细节,可能值得一读。

Leveraging the "using" keyword in C#

快速搜索@SO会导致你this post,在那里你可以在那里找到答案了。