Вопрос

У меня есть две базы данных Microsoft SQL 2005, настроенные в сценарии отработки отказа. Строки подключения к приложению имеют «Отказоустойчивый партнер» указано в строке подключения.

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

Связано ли это в основном со скоростью, с которой происходит сбой баз данных, или что-то еще можно сделать, чтобы предотвратить эти ошибки?

Это было полезно?

Решение

Вы правы: это связано с тем, сколько времени требуется базам для восстановления после отказа.

Хронология переключения при синхронном зеркалировании выглядит примерно так:

<Ол>
  • Основной сервер A завершает работу и закрывает все соединения. С этого момента любой клиент, пытающийся подключиться к серверу А, принудительно закрывает свое соединение.
  • Основной сервер A обеспечивает полную синхронизацию его журналов с дополнительным сервером B.
  • Служба SQL сервера B запускается.
  • Служба SQL сервера B начинает принимать соединения, и в этот момент клиенты могут снова подключиться.
  • Независимо от того, насколько быстры ваши серверы, будет короткий (по крайней мере, секунда) период, когда соединения будут бомбить. Как сказал Стивен Лоу, вам нужно перехватить это исключение, подождать и повторить попытку. Имейте в виду, что будет сложнее, если ваше приложение выдает несколько запросов подряд как часть более крупной транзакции - ваша транзакция может быть неудачной.

    Другие советы

    Предостережение: опция 'отказоустойчивый партнер' была недоступна несколько лет назад (или, по крайней мере, я об этом не знал!), поэтому следующее решение может быть устаревшим

    нам пришлось перехватывать исключения из-за потери соединения (несколько разных вариантов), подождать несколько секунд и повторить попытку. Это требовало обертки для всех операций с базой данных для автоматизации логики ожидания и повтора - что не было большой работой и оказалось довольно удобным; Усилия были направлены на изучение кодов ошибок и типов исключений и составление таблицы решений о том, можем ли мы безопасно повторить операцию или нет.

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

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top