Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 当主体发生故障时自动故障切换到镜像数据库的多个连接_C++_Connection String_Connection Pooling_Failover_Database Mirroring - Fatal编程技术网

C++ 当主体发生故障时自动故障切换到镜像数据库的多个连接

C++ 当主体发生故障时自动故障切换到镜像数据库的多个连接,c++,connection-string,connection-pooling,failover,database-mirroring,C++,Connection String,Connection Pooling,Failover,Database Mirroring,我有一个主体数据库(服务器a)、镜像数据库(服务器B)和见证数据库(服务器C)。数据库设置为自动故障转移,即,当服务器A停机或故障转移时,服务器B承担新主体数据库的角色。据我所知,数据库仲裁设置正确 < >我在C++中编写了一个应用程序,连接到数据库并获得一个值,以确保一个真正的连接。当GetValue调用发生故障时,应用程序会进行检测,并在发生错误时尝试重新连接 问题是: 当我有多个到数据库的连接时(连接两个线程,一旦连接,它将在循环中获得一个值),当发生故障转移时(停止服务器a上的sql s

我有一个主体数据库(服务器a)、镜像数据库(服务器B)和见证数据库(服务器C)。数据库设置为自动故障转移,即,当服务器A停机或故障转移时,服务器B承担新主体数据库的角色。据我所知,数据库仲裁设置正确

< >我在C++中编写了一个应用程序,连接到数据库并获得一个值,以确保一个真正的连接。当GetValue调用发生故障时,应用程序会进行检测,并在发生错误时尝试重新连接

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

“驱动程序={SQL Native Client};服务器=tcp:Server\u A;故障转移\u Partner=tcp:Server\u B;数据库=SomeDatabase;Uid=SomeUser;Pwd=SomePassword;”

**注** 我已通过监视数据库验证故障转移是否已发生

即使与数据库的连接已被正确处理,我也无法重新连接到数据库,除非我重新启动应用程序,或者如果我使服务器A重新联机(现在充当镜像数据库),然后故障切换服务器B(关闭sql server),使服务器A再次成为主体数据库,应用程序无需完全关闭即可重新连接

虽然我可以操纵连接字符串,使server_B成为新的主体,而server_A成为新的故障转移伙伴,但这不是一个理想的解决方案,因为将使用更多的连接

请记住,这只会发生在多个数据库连接的情况下。如果我只使用一个连接运行应用程序,则一切正常,并且在发生故障转移时可以重新连接


编辑:如果我一开始就连接多个线程,一切正常。当我关闭SQL Server并因此发生故障转移时,我只能在检查并删除所有对象并重新实例化新对象时重新连接。此外,我正在使用SQL原生客户端11.0(ODBC)。想法?

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

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

此修补程序应用于应用程序服务器。如果你想排除这一可能的原因,你可以测试提高超时时间(就像在文章的解决方法部分所说的那样),以确保这不是问题所在

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

我知道您认为问题不在于这些,而在于您测试的单/多连接问题


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

好的,我找到了答案


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

很可能是您使用的驱动程序不是线程安全的,并且在线程环境中使用非线程安全的lib时,无法预测结果。如果是这种情况,如果不经过镜像过程,应用程序从一开始就不会失败吗?如果它不是线程安全的,我会怀疑无论故障转移如何,在多次连接时都会发生故障。当非线程安全的代码暴露在线程环境中时,很难预测会发生什么。提供的连接字符串已通过多种方式进行了修改,希望这就是问题所在。我尝试过处理网络参数,但仍然得到相同的结果。我也不确定故障转移伙伴上的tcp:tag,我真的找不到关于它的任何东西,但它和其他的一样。顺便说一句,tcp:tag是因为命名管道被禁用了,我不需要处理命名管道超时,因为它首先没有启用。最后,我尝试在连接和故障转移伙伴上设置更长的超时和更短的超时,但没有成功。