没有办法关闭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
。(是的,我知道临时表在使用后应该被删除。)
我也试过
使用
{ }
创建一个新的作用域来封装连接。创建一个新线程连接到DB服务器。
在
Main
方法的末尾使用while(true) { Thread.Sleep(1000); GC.Collect(); }
。
以上都不能关闭SqlConnection。如何关闭连接?
ADO中的连接池。NET默认是启用的。这意味着当您"处置"连接时,您只是将它返回到池中。当您退出程序时,显然您最终释放了池中的所有内容。如果你想避免这种情况,你必须选择退出连接池。
要禁用,请在连接字符串中添加Pooling=false
参数:
var connection = new SqlConnection(
@"Data Source=(local)'SQLEXPRESS;Initial Catalog=TEST;Integrated " +
"Security=SSPI;Pooling=false;");