当试图连接到SQLDriverConnect时,Failover_Partner失败。
正在使用的连接字符串:
Driver={SQL Native Client};Failover_Partner=tcp:dby;Server=tcp:dbx;
Database=DB;Uid=user;Pwd=Pwd;Connect Timeout=300;Pooling=false当我们对dbx上的数据库进行故障转移时,下一次操作将执行SQLError(),这将提供以下信息:
SqlState: 08S01
NativeError: 10054
MessageText: “TCP Provider: An existing connection was forcibly closed by
the remote host."此时,我们断开连接,然后关闭该连接的所有打开句柄。
然后使用相同的连接字符串调用SQLDriverConnect。当我们只有一个打开连接时,这个调用就成功了。当我们有多个打开的连接时,我们会收到以下错误:
[Microsoft][SQL Native Client][SQL Server]Login failed for user 'user'.在dbx服务器上,错误日志显示:
Logon Error: 18456, Severity: 14, State: 38.
Logon Login failed for user 'XSUser'. Reason: Failed to open the explicitly
specified database. [CLIENT: 54.164.196.67] 在dby服务器上没有新的日志。
当我们只使用一个打开的连接运行时,故障转移可以正常工作。只有当存在多个开放连接时,我们才会遇到问题。
当我们启动dbx失败时,我们使用提供的连接字符串成功地连接到所有连接上的dby。此时,当我们连接到dby并且可以通过dby失败时,所有连接都成功地连接到dbx。
我们怀疑连接池可能有问题。然而,我相信我们已经成功地禁用了连接池:
SQLINTEGER pooling;
DBCRESULT rc = SQLGetEnvAttr(m_henv, SQL_ATTR_CONNECTION_POOLING ,
&pooling, 0, NULL);
rc is 0, pooling is 0.如能就如何开展工作提出任何建议,将不胜感激。
编辑:
我的测试过程是让应用程序连接和查询一些数据。然后,由于应用程序的连接仍然处于打开状态,请在主服务器上手动使用Management来对数据库进行故障转移。然后在镜像服务器上使用Management运行与成功的应用程序相同的选择stmt。此时,我发布应用程序以执行SELECT。对SQLExecDirect的调用失败,然后调用SQLDriverConnect,后者也会失败。自从Management中的SELECT成功之后,我本以为对SQLDriverConnect的调用会成功。
发布于 2014-08-27 19:00:29
当数据库镜像转到镜像机器时,服务器将在数据库上运行启动代码,包括恢复步骤,以确保数据库中事务的一致性。这个过程可能需要一段时间,可能在10到20秒左右。
您需要等待dby上的数据库联机。我建议重新尝试连接几次,中间等待一两秒钟。
不要禁用连接池,这只会导致性能问题,并且与数据库镜像无关。
https://dba.stackexchange.com/questions/75132
复制相似问题