【问题标题】:SQLServerException: The connection is closed and not auto reconnecting to secondary db after failoverSQLServerException:连接已关闭,故障转移后不会自动重新连接到辅助数据库
【发布时间】:2020-12-29 15:22:09
【问题描述】:

我有一个 springboot 应用程序,它连接到 Azure SQL 数据库。我想设置 Azure SQL Server 的自动故障转移。

我在区域 A 中有 primary sql server1 (server1.database.windows.net),只有一个 db("demo")。 然后,我通过在区域 B 中为同一数据库创建 辅助服务器 2 (server2.database.windows.net) 为服务器 1 设置自动故障转移组。 p>

目前使用以下 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

【问题讨论】:

  • 我已经阅读了您之前的帖子。我也有 springboot 应用程序和故障转移组,我在两个数据库服务器之间创建了相同的用户名和密码。当我在 azure 门户上进行手动故障转移时,我的 springboot 应用程序将自动连接到数据库服务器。所以我建议使用相同的用户名和密码来解决问题。
  • 连接到故障转移组就像连接到一个数据库服务器,而把其他事情留给它。
  • @JosephXu,两台服务器的用户名和密码相同。只是主要和次要的服务器名称不同。最终的用户名将分别是 user@server1 和 user@server2。发生故障转移时,我可以使用数据库客户端连接到提到的故障转移组。只是一旦我进行故障转移,与数据库的连接就会给我 SQLErrorException 说连接已关闭。并且这些连接不会被修复以连接到最新的服务器。
  • 请将“user@server1”和“user@server2”改为“user”。效果很好。
  • @Joseph Xu,刚刚尝试为两个服务器使用单用户“演示”,它不允许我连接并在发生故障转移时给出相同的异常。你建议的任何其他方式。可能是 Hikari CP 错误或任何配置错误?

标签: sql-server spring-boot azure-sql-database hikaricp mssql-jdbc


【解决方案1】:

在 application.properties 文件中:
username 属性中,您可以删除@server1@server2。这样当我们进行手动故障转移时,我们的 spring-boot 应用程序将自动连接到故障转移组而不会出现错误。

我试了几次,都成功了。

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

当我启动我的应用程序时,它显示:

当我手动进行故障转移时,它显示:

【讨论】:

  • 徐,我尝试为连接字符串中的故障转移组名称的两个服务器创建一个用户演示,结果是相同的。发生故障转移时,它仍然不允许我通过应用程序连接。
  • 这可能是 Hikaricp 配置错误。我正在使用Spring Data jdbc 连接到故障转移组。
  • Xu,感谢您的帮助,但这似乎是一个不同的问题。当我发现问题时,我会更新答案。
  • 你好,我的意思是你可以尝试使用Spring Data根据official document连接故障转移组。 Hikari CP 是 Spring Boot 中默认的数据库连接池。请查看我的更新答案。
  • 徐,该应用默认使用Hikari。每当发生故障转移时,它都会导致 Broken pipe write failed 然后不刷新连接,这会导致 Connection 关闭。可以分享一下hikari的配置吗
猜你喜欢
  • 2021-03-17
  • 2014-08-24
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2020-03-09
  • 1970-01-01
  • 2017-01-27
相关资源
最近更新 更多