Что может вызвать SqlClient для повторного использования недопустимых соединений?

У нас есть служба WCF, размещенная в IIS, работающая на сервере. Служба подключается к экземпляру SQL Server, запущенному на другом сервере. В нашем коде мы открываем и закрываем соединение для каждого запроса. Служба WCF обрабатывает несколько запросов в минуту в базе данных.

Если я перезапущу SQL-службу, не останавливая службу WCF, служба WCF начнет регистрировать ошибки в нашем журнале ошибок, что совершенно нормально.

Проблема в том, что иногда (не всегда) после перезапуска службы SQL служба WCF продолжает сообщать об этой ошибке по каждому запросу:

Cannot open database "mydatabase" requested by the login. The login failed." 

Трассировка стека ошибки заканчивается:

 at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) at System.Data.SqlClient.SqlConnection.Open() 

Хотя это происходит, я могу подключиться к базе данных с помощью SQL Management Studio (с той же машины, на которой запущена служба WCF). Чтобы исправить эту проблему, мне нужно переработать пул приложений для моей службы WCF.

Поэтому мой вопрос: что может привести к этому и что я могу сделать, чтобы мое приложение могло восстановиться после перезапуска SQL?

PS: В моем блоке dev (также работает IIS), когда я делаю тот же тест, я получаю ту же ошибку несколько раз (в то время как база данных загружается, я полагаю), а затем она снова начинает работать.

Иногда соединение, которое вы получаете из пула, является новым (и попытка подключения успешно завершена), в то время как соединение повторно используется и попытка подключения не выполняется. Не все разъединенные соединения фактически используются повторно, поскольку пул может или не может обнаружить условие и удалить такое соединение из пула.

Отсюда :

Если соединение существует на исчезнувшем сервере, это соединение может быть выведено из пула, даже если пул соединений не обнаружил отключенное соединение и отметил его как недействительный. Когда это происходит, генерируется исключение. Однако вы должны закрыть соединение, чтобы отпустить его обратно в пул.

Если вы создаете соединения очень редко, чтобы не было последствий для производительности, лучше всего отключить объединение. Просто установите Pooling на no в строке подключения.

  • Очень медленное подключение к SQL Server 2005 только при использовании ADO.NET с SqlClient
  • SqlClient Xml Параметр вывода "не был предоставлен"
  • Как заполнить параметр таблицы с использованием пользовательского DbDataReader?
  • System.InvalidCastException: не удалось преобразовать значение параметра из XElement в строку
  • Вставка записей списка в базу данных с хранимыми процессами
  • Исправление System.Data.EntityException: основной провайдер отказался от Commit
  • Во время запуска триггера возникла ошибка.
  • Является ли порт автоматически собранным из SQL Server?
  • Что возвращает SQL Server в C #
  • Извлечение записей из нескольких операторов
  • SQLClient Какие номера ошибок связаны с ошибками подключения SQL Server, поэтому я могу повторить попытку
  • Interesting Posts

    SQL – Создать круглый номер robin на вставке

    как показать год в SQL

    Как обновить таблицу на SQL Server с несколькими объединениями в обновленной таблице? (FROM FROM JOIN)

    условный внутренний или внешний соединительный сервер sql

    Не удается установить автоматическое увеличение с помощью SQL Server Express Management Studio?

    SQLServer Выберите, что объединяет и возвращает результаты, в которых несколько записей объединения соответствуют значениям

    Как найти текст внутри хранимых процедур в нескольких базах данных

    Ошибка после миграции базы данных с SQL Server CE на SQL Server

    Исключение, вызывающее «.ctor» с аргументом «2»: «SetParent не удалось войти в систему« XXX ».»

    Вывод SQL нескольких локальных переменных в один столбец

    Как использовать диапазон дат в предложении WHERE

    Как получить значения за все месяцы в T-SQL

    Как получить доступ к SQL Server из Cocoa (Mac OS X)?

    Как выбрать отдельные записи, где условия без использования подзапросов

    Параметры для репликации базы данных Microsoft SQL Server в MySQL / PostgreSQL в Linux

    Давайте будем гением компьютера.