В течение многих лет у меня возникали очень странные проблемы со всеми моими веб-приложениями, которые подключаются к серверу SQL.
Проблема заключается в том, что если что-то случится с сервером базы данных (перезапуск сервера или другая проблема), веб-приложение de перестанет работать с этого момента, даже если сервер базы данных будет жив и исправен.
В результате происходит сбой каждой операции ADO.NET (ExecuteNonQuery, CreateReader, BeginTransaction, ...) с InvalidOperationException : " Недопустимая операция. Соединение закрыто ". Кажется, что вызов SqlConnection.Open () возвращает соединение из пула приложений, которое ... закрыто!
Согласно документации, пул соединений должен автоматически удалять разорванные соединения из пула соединений, но, по-видимому, закрытое соединение не считается «разорванным», поэтому вызов SqlConnection.Open () счастливо возвращает закрытое соединение, предполагая, что оно открыто, без проверки этого.
Мой текущий способ - проверить состояние соединения сразу после его открытия:
using (SqlConnection connection = new SqlConnection( connectionString ))
{
connection.Open();
if (connection.State != ConnectionState.Open)
{
SqlConnection.ClearAllPools();
connection.Open();
}
// ...
}
Этот обходной путь пока работает, но я не чувствую себя комфортно, делая это.
Итак, мои вопросы:
- Почему SqlConnection.Open () возвращает закрытые соединения из пула соединений?
- Допустим ли мой обходной путь?
- Есть ли лучший способ справиться с этим?