У меня есть основная база данных (server_A), зеркальная база данных (server_B) и база данных-свидетель (server_C). Базы данных настроены на автоматическое переключение при сбое, то есть, когда сервер_А выходит из строя или происходит отработка отказа, сервер_В берет на себя роль новой основной базы данных. Насколько мне известно, кворум базы данных настроен правильно.
Я написал приложение на С++ для подключения к базе данных и получения значения для обеспечения истинного соединения. Приложение обнаруживает сбой при вызове GetValue и пытается повторно подключиться при возникновении ошибки.
Проблема заключается в следующем: когда у меня есть НЕСКОЛЬКО подключений к базе данных (два потока подключены, после подключения он получит значение в цикле), когда происходит отработка отказа (остановка сервера sql на сервере A, чтобы сервер B стал основным ), я обнаруживаю сбой соединения, разрушаю свое соединение и пытаюсь восстановить соединение, используя ту же строку соединения:
"Driver={SQL Native Client};Server=tcp:Server_A;Failover_Partner=tcp:Server_B;Database=SomeDatabase;Uid=SomeUser;Pwd=SomePassword;"
** ПРИМЕЧАНИЕ ** Я убедился, что переход на другой ресурс произошел путем мониторинга баз данных.
Несмотря на то, что соединение с базой данных было правильно удалено, я не могу повторно подключиться к базе данных, пока не перезапущу приложение, ИЛИ если я верну server_A в оперативный режим (теперь он действует как зеркальная база данных), а затем отработку отказа server_B (отключение сервера sql ) снова сделав сервер A основной базой данных, приложение может повторно подключиться без необходимости полного закрытия.
Хотя я мог бы манипулировать строкой подключения, чтобы сделать server_B новым принципалом, а server_A новым Failover_Partner, это не идеальное решение, так как будет использоваться гораздо больше подключений.
Имейте в виду, что это происходит ТОЛЬКО при множественных подключениях к базе данных. Если я запускаю приложение только с одним соединением, все в порядке, и я могу снова подключиться, когда произойдет аварийное переключение.
РЕДАКТИРОВАТЬ: Если я сначала подключаюсь к нескольким потокам, все в порядке. Когда я завершаю работу SQL Server и, следовательно, происходит отказоустойчивость, я могу повторно подключиться только тогда, когда я прохожу и удаляю ВСЕ объекты и повторно создаю экземпляры новых объектов. Кроме того, я использую SQL Native Client 11.0 (ODBC). Мысли?