我是否需要使用关键字关闭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 Pattern。 IDisposable允许以及时,确定的方式释放昂贵的资源。
当您使用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模式时,您会提供确定性的资源释放,并且在消费者不小心并且不处理该对象的情况下,终结器将清理该对象。
如果您使用using
,则无需关闭它,因为它在内部调用Displose()
。
这里有关于ADO.NET中关键字using
的一些细节,可能值得一读。
Leveraging the "using" keyword in C#
快速搜索@SO会导致你this post,在那里你可以在那里找到答案了。
谢谢。问题是 - 连接是立即关闭还是在垃圾回收器到达时关闭?因为这对我的情况有所影响。 – c00000fd 2013-03-21 02:34:54
“确保你使用的连接字符串相同” - 你是什么意思?将'SqlConnection cn'定义为一个静态变量? – c00000fd 2013-03-21 02:37:18
'它非确定性finalisation' = **错误**。在'using'语句的作用域之后,连接立即被*处理。这与垃圾收集无关。事实上,非确定性GC正是为什么将IDisposable接口和Dispose模式引入.NET的原因。 – 2013-03-21 02:39:45