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

У меня есть приложение Springboot, в котором оно подключается к базе данных SQL Azure. И я хотел настроить автоматическую отработку отказа Azure SQL Server.

У меня есть основной sql server1 (server1.database.windows.net) в регионе A с одной базой данных (демо). Затем я настроил группу автоматического перехода на другой ресурс для сервера 1, создав дополнительный сервер 2 (server2.database.windows.net) в регионе B для той же базы данных.

В настоящее время для настройки используется приведенная ниже строка подключения JDBC:

jdbc:sqlserver://<my-failover-group-name>:1433;database=demo;encrypt=true;trustServerCertificate=false;loginTimeout=30;applicationIntent=ReadWrite;

Hikari CP имеет соединения, способные подключаться с указанной выше строкой подключения к моей основной БД, но когда я выполнил отработку отказа вручную на портале Azure, подключения к базе данных должны автоматически повторно подключаться к вторичному серверу, который теперь стал основным, но Я продолжаю получать следующее исключение: -

com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed.
  • Версия mssql-jdbc: - 8.2.2.jre8
  • Версия Springboot: - 2.2.2.RELEASE

person user2594    schedule 11.09.2020    source источник
comment
Я прочитал твой предыдущий пост. У меня также есть приложение Springboot и группа аварийного переключения, я создал одно и то же имя пользователя и пароль между двумя серверами БД. Когда я выполнил аварийное переключение вручную на портале Azure, мое приложение Springboot автоматически подключится к серверу БД. Поэтому я предлагаю использовать то же имя пользователя и пароль для решения проблемы.   -  person Joseph Xu    schedule 11.09.2020
comment
Подключение к отказоустойчивой группе похоже на подключение к одному серверу БД и предоставление ему других возможностей.   -  person Joseph Xu    schedule 11.09.2020
comment
@JosephXu, у меня одинаковые имя пользователя и пароль для обоих серверов. Просто имя сервера для первичного и вторичного отличается. Окончательное имя пользователя будет user@server1 и user@server2 соответственно. Я могу подключиться к упомянутой группе отработки отказа с помощью клиента БД, когда происходит отработка отказа. Просто, когда я выполняю отработку отказа, соединения с БД выдают мне SQLErrorException, говорящее, что соединение закрыто. И эти соединения не восстанавливаются для подключения к последнему серверу.   -  person user2594    schedule 11.09.2020
comment
Пожалуйста, измените «user@server1» и «user@server2» на «user». Это работает хорошо.   -  person Joseph Xu    schedule 11.09.2020
comment
@Joseph Xu, только что попробовал однопользовательскую «демонстрацию» для обоих серверов, она не позволяет мне подключиться и выдает то же исключение, когда происходит аварийное переключение. Любой другой способ, который вы предложите. Может ли это быть ошибкой Hikari CP или какой-либо ошибкой конфигурации?   -  person user2594    schedule 13.09.2020


Ответы (1)


В файле application.properties:
В свойстве username можно удалить @server1 или @server2. Таким образом, когда мы выполняем отработку отказа вручную, наше приложение с пружинной загрузкой автоматически подключается к группе отработки отказа без ошибок. введите здесь описание изображения

Я пытался несколько раз, и все удалось.

logging.level.org.springframework.jdbc.core=DEBUG

spring.datasource.url=jdbc:sqlserver://<FailoverGroupname>.database.windows.net:1433;database=<DatabaseName>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
spring.datasource.username=joseph
spring.datasource.password=***

spring.datasource.initialization-mode=always

обновление: мое application.property выглядит следующим образом:

logging.level.org.springframework.jdbc.core=DEBUG

spring.datasource.url=jdbc:sqlserver://<FailoverGroupName>.database.windows.net:1433;database=<DatabaseName>;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
spring.datasource.username=joseph
spring.datasource.password=<password>

spring.datasource.initialization-mode=always

# Hikari will use the above plus the following to setup connection pooling
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

Когда я запускаю свое приложение, оно показывает: введите здесь описание изображения

Когда я выполняю отработку отказа вручную, отображается: введите здесь описание изображения

person Joseph Xu    schedule 11.09.2020
comment
Сюй, я попытался создать пользовательскую демонстрацию для обоих серверов с именем отказоустойчивой группы в строке подключения, и результат тот же. Тем не менее, это не позволяет мне подключиться через приложение, когда происходит отработка отказа. - person user2594; 13.09.2020
comment
Возможно, это ошибка конфигурации Hikaricp. Я использую Spring Data jdbc для подключения к группе отработки отказа. - person Joseph Xu; 14.09.2020
comment
Сюй, спасибо за помощь, но это похоже на другую проблему. Я обновлю ответ, когда узнаю о проблеме. - person user2594; 14.09.2020
comment
Привет, я имею в виду, что вы можете попробовать использовать Spring Data для подключения к группе отработки отказа в соответствии с официальный документ. Hikari CP — это пул соединений с базой данных по умолчанию в Spring Boot. Пожалуйста, смотрите мой обновленный ответ. - person Joseph Xu; 14.09.2020
comment
Сюй, приложение по умолчанию использует Hikari. Всякий раз, когда происходит отработка отказа, он дает ошибку записи в сломанный канал, а затем не обновляет соединения, и это дает соединение закрыто. Можете ли вы поделиться конфигурацией hikari - person user2594; 14.09.2020
comment
Да, пожалуйста, смотрите мою обновленную часть моего ответа. Надеюсь, это будет полезно для вас. - person Joseph Xu; 15.09.2020
comment
Когда при аварийном переключении вручную он будет доступен только для чтения, верно? - person Joseph Xu; 15.09.2020
comment
Вы используете mssql-jdbc, потому что я пробовал с той же версией Hikari 3.4.5 и той же конфигурацией, и возникает исключение, когда соединение закрывается, и оно не работает до бесконечности. Соединения не могут быть восстановлены даже после льготного периода - person user2594; 15.09.2020
comment
Вы добавили свой IP-адрес клиента в правило брандмауэра server2? - person Joseph Xu; 16.09.2020
comment
Да добавили это перед собой. Похоже, что какая-то зависимость перезаписывает hikaricp - person user2594; 18.09.2020