可能重复:
Entity framework 4 not closing connection in sql server 2005 profiler为什么我的使用语句不关闭连接?
好了,很多对计算器的开发者说,我不应该担心收我的连接:我使用的语句将关闭我的连接,here和here和遍布整个网站。不幸的是,我没有看到它发生。这里是我的代码:
[Test, Explicit]
public void ReconnectTest()
{
const string connString = "Initial Catalog=MyDb;Data Source=MyServer;Integrated Security=SSPI;Application Name=ReconnectTest;";
for (int i = 0; i < 2000; i++)
{
try
{
using (var conn = new SqlConnection(connString))
{
conn.Open();
using (var command = conn.CreateCommand())
{
command.CommandText = "SELECT 1 as a";
command.CommandType = CommandType.Text;
command.ExecuteNonQuery();
}
//conn.Close();
// optional breakpoint 1 below
}
}
catch(SqlException e)
{
// breakpoint 2 below
Console.WriteLine(e);
}
// breakpoint 3 below
}
}
当我让所有的断点,并开始我的测试,在第一次迭代成功,和我打了断点3.此时,连接仍然是开放的:我看到它的探查,并且sp_who2也输出它。
让我们假设在这个时候我出去吃午饭,而我的连接是空闲的。因此,我们的生产服务器将其杀死。为了模仿它,我正在扼杀SSMS的联系。
因此,当我点击F5并运行第二次迭代时,我的连接被终止。不幸的是,它不会自动重新打开,因此ExecuteNonQuery将引发以下异常:“发生传输级错误”。当我运行第三次迭代时,我的连接实际上打开了:我将其视为Profiler中的事件,并且sp_who2也将其输出。
即使当我取消注释我的conn.Close()命令时,连接仍然没有关闭,并且当我从SSMS中取消它时,下一次迭代仍然爆炸。
我错过了什么?为什么不能使用语句关闭我的连接?为什么不能Open()实际上第一次打开它,但下一次成功?
当你调用SqlConnection.Dispose()
,你因为using
块呢,连接不会关闭,每本身这个问题,源自my previous one
[连接池](http://msdn.microsoft.com/en-us/library/8xx3tyca(v = vs.80).aspx) – Blorgbeard 2012-02-03 18:21:28
这是一个预期的行为请阅读[连接重用/池]( http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx) – 2012-02-03 18:23:30