我在故障转移方案中设置了两个 Microsoft SQL 2005 数据库。应用程序连接字符串具有连接字符串中指定的“故障转移伙伴”。
当前活动的数据库故障转移到从数据库时,有一小段时间用户可以获得SqlClient.SqlException,并显示“现有连接被远程主机强制关闭”消息。
这主要是由于数据库故障转移的速度还是可以采取其他措施来防止这些错误?
我在故障转移方案中设置了两个 Microsoft SQL 2005 数据库。应用程序连接字符串具有连接字符串中指定的“故障转移伙伴”。
当前活动的数据库故障转移到从数据库时,有一小段时间用户可以获得SqlClient.SqlException,并显示“现有连接被远程主机强制关闭”消息。
这主要是由于数据库故障转移的速度还是可以采取其他措施来防止这些错误?
你是对的:这与数据库故障转移需要多长时间有关。
同步镜像故障转移时间线如下所示:
无论您的服务器有多快,连接都会在短时间内(至少一秒钟)爆炸。就像 Steven Lowe 所说,你必须捕获那个异常,等待,然后再试一次。请记住,如果您的应用程序连续发出多个查询作为较大事务的一部分,它会更加复杂 - 您的事务可能会失败。
警告:“故障转移合作伙伴”选项几年前不可用(或者至少我不知道!)因此以下解决方案可能已过时
我们必须捕获连接丢失异常(几种不同的风格),等待几秒钟,然后再试一次。这需要所有数据库操作的包装器来自动执行等待和重试逻辑——这不是很多工作,但被证明相当方便;我们努力检查错误代码和异常类型,并就我们是否可以安全地重试操作制定决策表。
这是由于您的应用程序试图使用连接池中的现有连接。只有在发生此错误后,应用程序池才会被清除,新连接才会使用故障转移框。