[英]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 database
有too many temp tables are in the database
。 (是的,我知道临时表应该在使用后丢弃。)
我也试过
使用{ }
创建一个新的范围来包装连接。 结果是一样的。
创建一个新线程以连接到数据库服务器。 结果也是一样的。
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.