我有一个主体数据库 (server_A)、镜像数据库 (server_B) 和一个见证数据库 (server_C)。数据库设置为自动故障转移,也就是说,当 server_A 出现故障或故障转移时,server_B 承担新主体数据库的角色。据我所知,数据库仲裁设置正确。
我用 C++ 编写了一个应用程序来连接到数据库并获取一个值以确保真正的连接。应用程序检测 GetValue 调用何时发生故障,并在发生错误时尝试重新连接。
问题是这样的:当我与数据库有多个连接时(连接了两个线程,一旦连接,它将在循环中获取一个值),当发生故障转移时(停止服务器 A 上的 sql 服务器,因此服务器 B 将接管为主体),我检测到连接失败并破坏我的连接并尝试使用相同的连接字符串重新连接:
“驱动程序={SQL Native Client};服务器=tcp:Server_A;Failover_Partner=tcp:Server_B;Database=SomeDatabase;Uid=SomeUser;Pwd=SomePassword;”
** 注意 ** 我已经通过监控数据库验证了故障转移已经发生。
即使与数据库的连接已正确处理,我也无法重新连接到数据库,直到我重新启动应用程序,或者如果我将 server_A 重新联机(现在充当镜像数据库)然后故障转移 server_B(关闭 sql server ) 使服务器 A 再次成为主体数据库,应用程序可以重新连接而无需完全关闭。
虽然我可以操纵连接字符串以使 server_B 成为新的主体,而 server_A 成为新的 Failover_Partner,但这并不是一个理想的解决方案,因为将使用更多的连接。
请记住,这只发生在与数据库的多个连接时。如果我只使用一个连接运行应用程序,一切都很好,并且在发生故障转移时我可以重新连接。
编辑:如果我一开始用多个线程连接,一切都很好。当我关闭 SQL Server 并因此发生故障转移时,我只能在通过并删除所有对象并重新实例化新对象时重新连接。另外,我使用的是 SQL Native Client 11.0 (ODBC)。想法?