我该如何解决Azure角色中SQL Azure突然失去连接的问题?

14

我的Azure角色从数据库中获取处理的内容 - 它持有一个System.Data.SqlClient.SqlConnection实例,并定期创建一个SqlCommand实例并执行SQL查询。

现在,偶尔(通常是几天一次),运行查询将触发一个SqlException异常

服务在处理您的请求时遇到错误。请重试。错误代码40143。 当前命令发生了严重错误。如有任何结果,请放弃。

我已经看到了很多次了,现在我的代码捕获它,调用Dispose()关闭SqlConnection实例,然后重新打开连接并重试查询。后者通常会导致另一个SqlException异常

超时已过期。操作完成之前超时时间已过或服务器未响应。

这看起来很像SQL Azure服务器无法响应或由于某种原因不可用。

目前,我的代码没有捕获后面的异常,它被传播到RoleEntryPoint.Run()之外,并重新启动角色。重新启动通常需要约十分钟,一旦完成,问题就消失了一天左右。

我不喜欢我的角色重新启动 - 这需要一段时间,我的服务功能受到阻碍。我想做一些更聪明的事情。

解决这个问题的策略是什么?我应该重试几次查询,以及多少次和间隔多少时间?我应该做些别的吗?什么时候放弃并让角色重新启动?

2个回答

14

它也可以通过NuGet获得。 - dunnry
谢谢dunnry,我没有注意到那个。我责怪Wade没有让我们保持适当的更新 ;) - David Steele
5
那个瞬时故障处理网站出现了顽固性故障:已经宕机了。 - Rory
现在它已经过时了,也没有支持的解决方案。 - O'Rooney

2
我们使用了TransientFaultHandling,但它并不能处理所有奇怪的异常。
例如,昨天出现了这个:
服务在处理您的请求时遇到错误。请重试。错误代码 40143。 当前命令发生了严重错误。如果有任何结果,则应将其丢弃。, stacktrace at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, . . .
即使出现这种情况,也可以采用合理的方法:
1.确定调用发生的粗略伪事务。 2.将此块包装在try-catch中。 3.发生异常时,“回滚”伪事务。
典型工作流程示例:
1.获取Azure队列消息 2.从SQL Azure查询数据 3.处理数据, 4.上传结果 5.删除消息。
将B和C一起包装在try-catch中。如果在“无害”的SQL Azure调用期间发生了什么事情,只需退出而不删除消息,它将在可见性超时后再次弹出。
实际上,这是非常常见的方法:组织成类似事务的块,将块包装在try-catch中,在异常时优雅地回滚。永远不要假设某些调用不会失败。所有调用都会不时失败。

2
我认同你的方法,但David Steele的答案也是正确的。实际上,两个答案处理的是不同的层面。你使用瞬态故障处理框架来处理短暂错误;如果情况持续存在,你会中止当前操作并稍后重试(或丢弃)。 - Fernando Correia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接