“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 连接的主要内容,如果未能解决你的问题,请参考以下文章

socket 如果不关闭会自动关闭吗?为啥要心跳连接?

“打开/关闭”SqlConnection还是保持打开状态?

为啥在java中打开流后一定要关闭流??好像关不关没有不同,程序的结果都是一样的。。。

SQL Server 相当于 MySQL 的 USING

手机上不小心把路由器的无线关了怎么打开?

带有 using 关键字的 SqlDataAdapter