2012-05-16 2 views
5

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

Если я перезапущу службу 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?

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

+0

Возможно, вы захотите попытаться поймать SqlException и проверить конкретный код ошибки, а затем вызвать SqlConnection.ClearPool (sqlConnection); затем повторите заявление еще раз – Termit

ответ

1

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

From here:

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

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