【问题标题】:SqlClient.SqlException occurs during Database Fail Over数据库故障转移期间发生 SqlClient.SqlException
【发布时间】:2009-03-06 22:38:05
【问题描述】:
我在故障转移方案中设置了两个 Microsoft SQL 2005 数据库。应用程序连接字符串具有连接字符串中指定的“故障转移伙伴”。
当当前活动的数据库故障转移到从数据库时,有一小段时间用户可以获得SqlClient.SqlException,并显示“现有连接被远程主机强制关闭”消息。
这主要是由于数据库故障转移的速度,还是可以采取其他措施来防止这些错误?
【问题讨论】:
标签:
sql-server
sql-server-2005
exception
failover
【解决方案1】:
你是对的:这与数据库故障转移需要多长时间有关。
同步镜像故障转移时间线如下所示:
- 主服务器 A 关闭并关闭所有连接。从此以后,任何尝试连接到服务器 A 的客户端都将强制关闭其连接。
- 主服务器 A 确保其日志与辅助服务器 B 完全同步。
- 服务器 B 的 SQL 服务启动。
- 服务器 B 的 SQL 服务开始接受连接,此时客户端可以再次连接。
无论您的服务器有多快,都会有一个短暂(至少一秒钟)的时间连接会爆炸。就像 Steven Lowe 所说,你必须捕获那个异常,等待,然后再试一次。请记住,如果您的应用程序连续发出多个查询作为较大事务的一部分,则情况会更加复杂 - 您的事务可能会失败。
【解决方案2】:
警告:“故障转移合作伙伴”选项几年前不可用(或者至少我不知道!)因此以下解决方案可能已过时
我们必须捕获连接丢失异常(几种不同的风格),等待几秒钟,然后重试。这需要所有数据库操作的包装器来自动化等待和重试逻辑——这不是很多工作,而且被证明是相当方便的;我们的工作是检查错误代码和异常类型,并制定一个关于我们是否可以安全地重试操作的决策表。
【解决方案3】:
这是由于您的应用程序试图使用连接池中的现有连接。只有在发生此错误后,应用程序池才会被清除,新连接才会使用故障转移框。