在 C# 中使用块中的 break 语句对数据库连接的影响

Effect of break statement on DB connection within using block in C#

在处理使用大量数据库连接的项目时,我在使用 MSSQL 从池中获取连接时遇到了一些与超时相关的错误。

当然,所有数据库连接都在 using 块中,因此在关闭时应正确清除任何连接,但是 using 中会出现一个持续性错误在 reader 对象中读取单行的块,然后命中 break 语句,如下所示。

using (SqlConnection connection = new SqlConnection(connectionString)) {
    connection.Open();
    using (SqlCommand command = new SqlCommand(sqlString, connection)) {

        using (SqlDataReader reader = command.ExecuteReader()) {
            while (reader.Read()) {
                //Do something with the data then break
                break;
            }
        }
    }
}

该错误是间歇性的,但在我 运行 系统上的每 5 个测试会话中有 4 个发生。我意识到离开 using 块应该会导致连接干净地关闭并将其释放到池中以供重用,但是奇怪的是这个错误一直出现在这一区域。

更改读取以删除 whilebreak 后,我没有再遇到此问题

using (SqlConnection connection = new SqlConnection(connectionString)) {
    connection.Open();
    using (SqlCommand command = new SqlCommand(sqlString, connection)) {

        using (SqlDataReader reader = command.ExecuteReader()) {
            if (reader.Read()) {
                //Do something with the data 
                //No need to break, as the select uses a unique ID for the row
            }
        }
    }
}

为了进一步调试这个问题,我需要弄清楚探索的途径,如果系统在超时时间内未能从池中获取连接只是单纯的DB数量巧合连接,我将需要重构几种方法来改变行为。

导致数据库连接返回池的机制是由 using 块干净地退出(即 运行 结束括号)触发的,还是由范围更改触发的?

break 只是终止 while 循环;它不会也不可能对封闭的 using 产生影响。在这两种情况下,连接都将关闭并返回到池中。

但是,带有 while 循环的代码完全有可能导致问题:如果它选择了一百万个结果,并循环遍历所有结果以找到 ID 为它的单行有兴趣,那肯定会不必要地占用连接。