При работе над проектом, который использует много соединений с базой данных, я сталкивался с рядом ошибок, связанных с таймаутами при получении соединения из пула с использованием 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
(т. е. бегом до конечной скобки), или изменением объема?