2009-03-04 3 views
1

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

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

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

ответ

2

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

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

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

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

0

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

1

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

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