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