0

我有一个主体数据库 (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)。想法?

4

2 回答 2

0

您所描述的许多内容与KB 2605597 “SQLClient 的 .NET Framework 数据提供程序创建镜像数据库连接时出现超时错误”中描述的问题一致。

KB 描述了连接超时设置为 15 秒时的问题,我听说过连接超时设置为 0 时的类似问题(出于其他原因,这不是一个好主意,以防万一)。

此修补程序应用于应用程序服务器。如果您想将此排除为可能的原因,您可以测试提高超时时间(就像帖子的解决方法部分中所说的那样)以确保它不是问题。

后来想到:我注意到的另一件不寻常的事情是您在连接字符串中指定了 TCP 协议和故障转移伙伴名称。从文档中我不清楚故障转移合作伙伴名称是否支持它。您可能想尝试删除它并改为指定网络属性。(这里推荐。)

我确实理解您认为问题不在于这些问题,因为您已经测试过单/多连接问题。

但是,我认为您最好简化连接字符串,以便它与已发布的示例尽可能一致,并确保这不是人们通常首先遇到的问题。(当存在延迟时会发生重试问题,这可能会使其有些零星。)

于 2014-08-27T22:46:36.963 回答
0

好的,我找到了答案。

我不得不修改主机文件,因为我的应用程序与数据库不在同一个域中。因此,当尝试进行故障转移时,我无法使用实例名称访问数据库(这是故障转移伙伴缓存的名称)。我更改了主机文件以将实例名称解析为机器的 IP 地址,现在一切正常。

于 2014-09-10T20:13:18.620 回答