SqlClient.SqlException происходит при отказе базы данных - PullRequest
1 голос
/ 04 марта 2009

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

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

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

Ответы [ 3 ]

2 голосов
/ 06 марта 2009

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

Временная шкала отработки отказа синхронного зеркалирования выглядит примерно так:

  1. Основной сервер A завершает работу и закрывает все соединения. С этого момента любой клиент, который попытается подключиться к серверу А, принудительно закроет свое соединение.
  2. Первичный сервер A обеспечивает полную синхронизацию журналов со вторичным сервером B.
  3. Запускается служба SQL сервера B.
  4. Служба SQL сервера B начинает принимать соединения, и в этот момент клиенты могут снова подключиться.

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

1 голос
/ 04 марта 2009

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

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

0 голосов
/ 04 марта 2009

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

...