有两个带有镜像设置的 SQL Server 实例。ServerA 是主服务器,ServerB 是镜像服务器。下面是我的连接字符串
jdbc:sqlserver://ServerA.company.com\\AB002;portNumber=23112;databaseName=SomeDBName;integratedSecurity=false;failoverPartner=ServerB.company.com\\CD002
当 ServerA 启动并作为主服务器运行时,应用程序成功连接到数据库并且一切都按预期工作。当 ServerA 故障转移到 ServerB 时,应用程序无法连接到 ServerB。以下是来自应用程序日志的错误消息
org.springframework.jdbc.CannotGetJdbcConnectionException:无法获得 JDBC 连接;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException:与主机 ServerB 的 TCP/IP 连接,端口 1433 失败。错误:“null。验证连接属性。确保 SQL Server 实例正在主机上运行并在端口接受 TCP/IP 连接。确保与端口的 TCP 连接未被防火墙阻止。
它应该根据连接字符串连接到 ServerB.company.com。经过一番研究,发现驱动程序忽略了连接字符串中的故障转移信息,并在初始连接到主database_mirroring
表时将其从主数据库缓存。这是我的database_mirroring
桌子的样子
DatabaseName | mirroring_role_desc | mirroring_safety_level_desc | mirroring_state_desc | mirroring_partner_instance
-------------------------------------------------------------------------------------------------------------------------
SomeDBName | PRINCIPAL | OFF | SYNCHRONIZED | ServerB\CD002
如果您查看该列mirroring_partner_instance
,它没有镜像实例的 FQDN,并且应用程序无法解析该名称。我可以通过在主机文件中添加一个条目来在本地解决此问题ServerB
在所有生产服务器上添加主机条目是不可能的。有没有人遇到过这个问题?除了添加主机条目之外,还有其他方法可以解决此问题吗?