当主体发生故障时,自动故障转移多个连接到镜像数据库

时间:2014-08-27 18:56:29

标签: c++ connection-string connection-pooling failover database-mirroring

我有一个主体数据库(server_A),镜像数据库(server_B)和见证数据库(server_C)。数据库设置为自动故障转移,即,当server_A关闭或故障转移时,server_B承担新主体数据库的角色。据我所知,数据库仲裁是正确设置的。

我用c ++编写了一个应用程序来连接数据库并获取一个值以确保真正的连接。应用程序检测GetValue调用何时发生故障,并在发生错误时尝试重新连接。

问题是: 当我有多个连接到数据库(两个线程连接,一旦连接,它将在循环中获得一个值),当发生故障转移(停止服务器A上的SQL服务器,所以服务器B将接管作为主体),我检测到连接失败并破坏我的连接并尝试使用相同的连接字符串重新连接:

" Driver = {SQL Native Client}; Server = 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)。想法?

2 个答案:

答案 0 :(得分:0)

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

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

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

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

我确实理解您认为问题不是由于您已经测试过的单/多连接问题。

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

答案 1 :(得分:0)

好的,我找到了答案。

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

相关问题