2012-02-03 68 views
1

可能重复:
Entity framework 4 not closing connection in sql server 2005 profiler为什么我的使用语句不关闭连接?

好了,很多对计算器的开发者说,我不应该担心收我的连接:我使用的语句将关闭我的连接,herehere和遍布整个网站。不幸的是,我没有看到它发生。这里是我的代码:

[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

+1

[连接池](http://msdn.microsoft.com/en-us/library/8xx3tyca(v = vs.80).aspx) – Blorgbeard 2012-02-03 18:21:28

+0

这是一个预期的行为请阅读[连接重用/池]( http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx) – 2012-02-03 18:23:30

回答

1

。这是释放回连接池的

为了避免不断建立/拆除连接,连接池将保持连接打开供您的应用程序使用。因此,连接仍然显示为开放是非常合理的。

之后发生了什么,我不能非正式解释 - 我知道保持随机连接打开而不是因为您的应用程序当然可以创建多个并发连接。

+1

是的,解释它。谢谢! – 2012-02-03 19:03:02

相关问题