SqlClient.SqlException происходит при отказе базы данных
-
03-07-2019 - |
Вопрос
У меня есть две базы данных Microsoft SQL 2005, настроенные в сценарии отработки отказа. Строки подключения к приложению имеют «Отказоустойчивый партнер» указано в строке подключения. Р>
Когда текущая активная база данных переключается на подчиненную базу данных, существует небольшой период времени, в течение которого пользователь может получить исключение SqlClient.SqlException с сообщением "Существующее соединение было принудительно закрыто удаленным хостом". Р>
Связано ли это в основном со скоростью, с которой происходит сбой баз данных, или что-то еще можно сделать, чтобы предотвратить эти ошибки?
Решение
Вы правы: это связано с тем, сколько времени требуется базам для восстановления после отказа.
Хронология переключения при синхронном зеркалировании выглядит примерно так:
<Ол>Независимо от того, насколько быстры ваши серверы, будет короткий (по крайней мере, секунда) период, когда соединения будут бомбить. Как сказал Стивен Лоу, вам нужно перехватить это исключение, подождать и повторить попытку. Имейте в виду, что будет сложнее, если ваше приложение выдает несколько запросов подряд как часть более крупной транзакции - ваша транзакция может быть неудачной.
Другие советы
Предостережение: опция 'отказоустойчивый партнер' была недоступна несколько лет назад (или, по крайней мере, я об этом не знал!), поэтому следующее решение может быть устаревшим
нам пришлось перехватывать исключения из-за потери соединения (несколько разных вариантов), подождать несколько секунд и повторить попытку. Это требовало обертки для всех операций с базой данных для автоматизации логики ожидания и повтора - что не было большой работой и оказалось довольно удобным; Усилия были направлены на изучение кодов ошибок и типов исключений и составление таблицы решений о том, можем ли мы безопасно повторить операцию или нет.
Это связано с тем, что ваше приложение пытается использовать существующее соединение в пуле соединений. Только после возникновения этой ошибки пул приложений очищается, а новые соединения используют окно отработки отказа.