У нас есть некоторый клиентский код, который использует класс 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 требует открытого и доступного соединения. Текущее состояние соединения закрыто» *