Влияние оператора разрыва на соединение с БД при использовании блока в C # - PullRequest
0 голосов
/ 02 февраля 2019

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

1 Ответ

0 голосов
/ 02 февраля 2019

break не делает ничего, кроме завершения цикла while;это не имеет и не может влиять на вложение using.В обоих случаях соединение будет закрыто и возвращено в пул.

Однако вполне возможно, что код с циклом while вызывает проблему: если он выбирает миллион результатов и выполняет циклчерез все они найти единственную строку с идентификатором, который ей интересен, тогда это определенно приведет к ненужному соединению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...