在处理使用大量数据库连接的项目时,使用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;
}
}
}
}
该错误是间歇性的,但在发生4每5个测试会话我在系统上运行的。我意识到离开using块应该会导致连接干净关闭,并将其释放到池中以供重用,但是奇怪的是,在该区域中始终出现此错误。
改变所读取的,以除去后,将while
和break
,我还没有看到这个问题再次出现
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
}
}
}
}
为了进一步调试此问题,我需要找出要探索的方法,并且如果系统在超时时间内未能从池中获取连接仅仅是由于数据库连接数量过多而引起的巧合,我将需要重构几种方法来更改行为。
是通过using
块干净退出(即运行到末尾括号)或范围更改触发DB连接返回到池的机制吗?
答案 0 :(得分:1)
break
只是终止while
循环而已。它不会也不会对封闭的using
产生影响。在这两种情况下,连接都将关闭并返回到池中。
但是,带有while
循环的代码很可能会引起问题:如果它选择一百万个结果,并循环遍历所有结果以找到感兴趣的ID的单行进入,那肯定会不必要地束缚连接。