C# 是否需要使用using关键字关闭SQL Server连接?

C# 是否需要使用using关键字关闭SQL Server连接?,c#,asp.net,database-connection,C#,Asp.net,Database Connection,对于这个问题,我不断发现相互矛盾的结果。让我们看一下运行SQL查询的C代码: using (SqlConnection cn = new SqlConnection(strConnectString)) { cn.Open(); using (SqlCommand cmd = new SqlCommand(strSQL, cn)) { cmd.ExecuteNonQuery(); } //Do I need to call? c

对于这个问题,我不断发现相互矛盾的结果。让我们看一下运行SQL查询的C代码:

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
语句时,不需要关闭连接

Scott hanselman在这里解释了这一点

在一个流量很大的web应用程序中,我在一个池中用完了连接


确保您使用的是相同的连接字符串,SQL将以这种方式使用连接池

是立即关闭连接,还是在垃圾被清除时关闭连接 收集者得到了它

编辑:


Dispose模式用于提供资源的确定性破坏。由于.net运行时垃圾收集器是非确定性的(这意味着您永远无法确定运行时何时将收集旧对象并调用它们的终结器)。因此,当您正确地实现Dispose模式时,您提供了资源的确定性释放,并且在使用者不小心并且没有处理对象的情况下,终结器将清理对象。

如果您在内部调用
Dispose()
时使用
using
,则无需关闭它

这里有一些关于在ADO.NET中使用关键字的详细信息,可能值得一读


快速搜索@SO将引导您找到,您也可以在那里找到答案

此处使用的
关键字:

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
超出
的使用范围后立即调用,这反过来又会立即关闭连接(因为SqlConnection.Dispose()正是这样做的)

更新


这不应与垃圾收集混淆。GC在.NET中是不确定的,这正是引入IDisposable inteface和的原因。IDisposable允许及时、确定地释放昂贵的资源。

谢谢。问题是——连接是立即关闭,还是在垃圾收集器到达时关闭?因为这与我的情况不同,“确保使用相同的连接字符串”——这是什么意思?将
SqlConnection cn
定义为一个静态变量?
It非确定性最终确定
=错误。在使用
语句超出
的范围后,立即处理连接。这与垃圾收集无关。事实上,非确定性GC正是将IDisposable接口和Dispose模式引入.NET的原因。谢谢你们。但这就是我在网上不断发现的——相互矛盾的信息。在我看来,我需要尽快处理所有连接。@c0000fd请参见,当连接第一次打开时,将根据一个精确的匹配算法创建一个连接池,该算法将连接池与连接中的连接字符串相关联。