Класс .NET SqlConnection, логика пула соединений и переподключения

У нас есть некоторый клиентский код, который использует класс SqlConnection в .NET для связи с базой данных SQLServer. Это периодически терпит неудачу с этой ошибкой:

"ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто"

«Временное» решение - перезагрузить процесс, после чего все работает, однако это явно неудовлетворительно.

Код хранит кэш экземпляров SqlConnection, по одному для каждой базы данных.

Мы хотели бы переписать код, но прежде чем я сделаю это, мне нужно знать несколько вещей:

Мой первый вопрос: неэффективно ли повторно подключать и отключать объекты SqlConnection, или базовая библиотека выполняет пул соединений от нашего имени?

// Is this bad/inefficient?
for(many-times)
{
    using(SQLConnection conn = new SQLConnection(connectionString))
    {
        // do stuff with conn
    }
}

Потому что наш код делаетнри выполнении вышеизложенного, вероятной причиной проблемы является то, что во время «жизни» соединения что-то происходит с базовой базой данных SQLServer, что приводит к закрытию соединения ...

Если оказывается, что стоит «кэшировать» объекты SqlConnection, что является рекомендуемым способом обработки всех ошибок, которые могут быть устранены простым «переподключением» к базе данных. Я говорю о таких сценариях, как:

База данных переведена в автономный режим и снова включена, но клиентский процесс не имел открытых транзакций, пока это происходило База данных была «отключена», затем «подключена»

Я заметил, что в SqlConnection есть свойство "State" ... есть ли подходящий способ сделать запрос?

Наконец, у меня есть тестовый экземпляр SQLServer с полными правами доступа: как я могу воспроизвести точную ошибку "ExecuteReader требует открытого и доступного соединения. Текущее состояние соединения закрыто"

Ответы на вопрос(3)

Ваш ответ на вопрос