繁体   English   中英

无法关闭SqlConnection

[英]No Way to Close SqlConnection

我知道这是一个老问题。 Google上的数千条声明称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行关闭。对吗? 但是,连线在第11行之后处于sleep

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

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

好的,它可能与GC 所以我明确地运行GC.Collect()来尝试收集conn对象。 但是在第14行之后,连接仍处于sleep

连接实际上在第15行之后关闭 这意味着计划的结束。

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

我也试过

  1. 使用{ }创建一个新的范围来包装连接。 结果是一样的。

  2. 创建一个新线程以连接到数据库服务器。 结果也是一样的。

  3. use while(true) { Thread.Sleep(1000); GC.Collect(); } while(true) { Thread.Sleep(1000); GC.Collect(); } while(true) { Thread.Sleep(1000); GC.Collect(); }在的末端Main方法。 结果也是一样的。

上面没有一个可以关闭SqlConnection。 如何关闭连接?

默认情况下启用ADO.NET中的连接池。 这意味着当您“处置”您的连接时,您只是将其返回到池中。 当您退出程序时,您显然最终会从池中释放所有内容。 如果要避免这种情况,则必须选择退出连接池。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM