没有办法关闭SqlConnection

本文关键字:SqlConnection | 更新日期: 2023-09-27 18:10:20

我知道这是一个老问题。谷歌上的数千条声明都说Connection will be closed in Dispose()。然而,谁真的证实了这一点?

我发现SqlConnection没有办法关闭。我有一个简单的程序(行号在左边)。

  class Program
  {
    static void Main(string[] args)
1   {
2        var connectionString = "Data Source=localhost;Initial Catalog=master;Integrated Security=SSPI;";
3        using (var conn = new SqlConnection(connectionString))
5        {
6            using (var cmd = new SqlCommand("create table #mytable(col1 int);", conn))
7            {
8                conn.Open();
9                cmd.ExecuteNonQuery();
10           }
11           conn.Close();
12           conn.Dispose();
13       }
14       GC.Collect();
15   }
  }

我有一个T-SQL语句检查活动连接

exec sp_who2

用调试器逐行调试,同时,我检查了与sp_who2的活动连接。

每个人都期望连接应该在第11行关闭。对吧?但是,连接在sleep中第11行之后。

好的,在下一行尝试手动处理。但是在第12行之后,连接仍然在sleep中。

好,下一行是自动处理。但是在第13行之后,连接仍然在sleep中。

好的,这可能与GC有关。所以我显式地运行GC.Collect()来尝试收集conn对象。但是在第14行之后,连接仍然在sleep中。

连接实际上在第15行之后关闭。

程序结束。在上面的程序中,创建了一个临时表#mytable。但是,只有在连接关闭时才会删除临时表。我们面临的问题是too many temp tables are in the database。(是的,我知道临时表在使用后应该被删除。)

我也试过

  1. 使用{ }创建一个新的作用域来封装连接。

  2. 创建一个新线程连接到DB服务器。

  3. Main方法的末尾使用while(true) { Thread.Sleep(1000); GC.Collect(); }

以上都不能关闭SqlConnection。如何关闭连接?

没有办法关闭SqlConnection

ADO中的连接池。NET默认是启用的。这意味着当您"处置"连接时,您只是将它返回到池中。当您退出程序时,显然您最终释放了池中的所有内容。如果你想避免这种情况,你必须选择退出连接池。

要禁用,请在连接字符串中添加Pooling=false参数:

var connection = new SqlConnection(
    @"Data Source=(local)'SQLEXPRESS;Initial Catalog=TEST;Integrated " +      
    "Security=SSPI;Pooling=false;");