我有一个存储过程,它在服务器列表中循环并查询它们的主数据库。当其中一台服务器关闭时,存储过程查询将超时。我如何跳过对任何非活动服务器的查询,或者,我如何捕捉服务器超时并继续对其余活动服务器进行查询?我确实有一个带有IsActive列的Server表,但当服务器关闭时,该值不会自动更改。当前,要查询的服务器列表基于表中的此IsActive列。另一个解决方案可能是找到一种方法,在服务器出现故障时自动更改IsActive列,但我不知道如何做到这一点。有什么想法吗?
编辑:我正在SQL Server 2008 中完成这一切
Donot从引擎内部(链接服务器)执行此操作。
从外部进程查询。并行启动查询,并设置连接超时。您的"查询"将一次获得所有信息,对于所有关闭的服务器,您只需等待一次,大致是您设置的超时,而不是对于每个关闭的服务器等待一次。我建议不要对连接进行"测试",因为尝试连接是测试。例如,如果您要在服务器上迭代并为每个服务器调用sp_testlinkedserver
,那么您最终可能会等待更多,因为测试仍然是序列化的,并且它们与尝试连接所花费的时间相同(这就是测试所做的尝试连接)。
更好的解决方案是使用可靠的传输和异步消息传递,例如Service Broker。由于编程模型是异步的,但消息传递是可靠的,因此服务器是否停机也没关系,稍后,当您最终恢复在线时,您会得到您想要的结果。