“using”关键字不会关闭打开的 SQL 连接
Posted
技术标签:
【中文标题】“using”关键字不会关闭打开的 SQL 连接【英文标题】:"using" keyword doesn't close an open SQL connection 【发布时间】:2013-11-25 20:55:19 【问题描述】:我指的是很久很久以前在 Stack Overflow 上发布的帖子。 Does End Using close an open SQL Connection
但是我有一个问题。我发现在 SQL 2012 Express Edition 和 SQL 2008 Developer Edition 上使用根本不会关闭连接。
这是我使用的代码。代码将遍历每个数据库并查找指定的特定表,但是,当它完成后,您在服务器上运行 sp_who,所有连接仍然存在。状态为睡眠,cmd 为“等待命令”,但是当您尝试创建数据库时,模型无法锁定,因为您仍然打开了一个连接。这是课堂上的错误吗?
using (SqlConnection conn = new SqlConnection("Data Source=" + ServerNameCombo.Text + ";Initial Catalog=master;Persist Security Info=True;User ID=" + UserNameEdit.Text + ";Password=" + PasswordEdit.Text))
using (SqlCommand dbs = new SqlCommand("Select name from sysdatabases", conn))
conn.Open();
using (SqlDataReader reader = dbs.ExecuteReader())
while (reader.Read())
using (SqlConnection dbconn = new SqlConnection("Data Source=" + ServerNameCombo.Text + ";Initial Catalog=" + reader["name"].ToString() + ";Persist Security Info=True;User ID=" + UserNameEdit.Text + ";Password=" + PasswordEdit.Text))
using (SqlCommand dbscmd = new SqlCommand("Select name from sysobjects where name = '" + TableName + "'", dbconn))
dbconn.Open();
if (dbscmd.ExecuteScalar() != null)
DBNames += (DBNames != "" ? "," : "") + reader["name"].ToString();
【问题讨论】:
您希望何时关闭连接? 连接池将其保持在该状态。调查一下。您实际上可以在 conn 字符串中禁用它。 你可以通过删除另一个using
-block周围的
来合并using
-blocks,可能会节省一些缩进...
【参考方案1】:
这是预期的行为;它关闭了托管连接,这意味着它释放了底层连接连接池。这会人为地保持连接打开,以便相同连接字符串和身份的下一个托管连接可以使用 现有 连接(在 TDS 管道中设置重置位)以避免连接启动延迟。
如果您不希望这样:禁用连接字符串中的连接池 (Pooling=false
)。
【讨论】:
有趣的是,OP 应该对连接池感到满意,因为他在一个循环中一遍又一遍地打开和关闭同一个连接。 @MarkRotteveel 确实如此,但我并没有真正使用相同的连接,因为我连接的数据库发生了变化。我发现物理连接不存在,这就是为什么连接仍然在服务器端很有趣。以上是关于“using”关键字不会关闭打开的 SQL 连接的主要内容,如果未能解决你的问题,请参考以下文章