【问题标题】:How do I address sudden loss of connection to SQL Azure in my Azure role?如何解决在我的 Azure 角色中突然失去与 SQL Azure 的连接?
【发布时间】:2011-08-10 06:03:48
【问题描述】:

我的 Azure 角色 grabs stuff to process from a database - 它拥有一个 System.Data.SqlClient.SqlConnection 实例并定期创建一个 SqlCommand 实例并执行 SQL 查询。

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

服务在处理您的请求时遇到错误。请再试一次。错误代码 40143。 当前命令发生严重错误。结果(如果有)应丢弃。

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

超时。在操作完成之前超时时间已过或服务器没有响应。

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

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

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

解决这个问题的策略是什么?我应该多次重试查询,多少次以及间隔多长时间?我应该做点别的吗?我什么时候放弃,让角色重新开始?

【问题讨论】:

    标签: .net sql-server azure azure-sql-database reliability


    【解决方案1】:

    我强烈建议您查看Transient Fault Handling Framework for SQL Azure

    这将帮助您处理连接和查询尝试的重试逻辑,我在生产中使用它并且效果很好。还有一篇不错的文章on technet 可能会有一些用处。

    [编辑:2013 年 10 月 17 日]

    The Transient Fault Handling Application BlockThe Transient Fault Handling Application Block 的模式和实践团队似乎已经发现了这一点

    【讨论】:

    • 它也可以通过 nuget 获得。
    • 感谢 dunnry,我没有发现这一点。我责怪韦德没有让我们及时更新;)
    • 瞬态故障处理站点有一个顽固的故障:已关闭。
    • 现在已经过时了,没有支持的解决方案。
    【解决方案2】:

    我们使用 TransientFaultHandling,它不能处理所有奇怪的异常。

    比如昨天弹出的这个:

    服务在处理您的请求时遇到错误。请再试一次。错误代码 40143。 当前命令发生严重错误。结果,如果有的话,应该丢弃。 ,System.Data.SqlClient.SqlConnection.OnError 处的堆栈跟踪(SqlException 异常,布尔型 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning() 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, ...

    即使在这种情况下也可以使用的合理方法:

    1. 识别调用发生的粗粒度伪事务。
    2. 将此块包装在 try-catch 中。
    3. 在异常情况下,“回滚”伪事务。

    典型工作流程示例:

    • 获取 Azure 队列消息
    • B 从 SQL Azure 查询数据
    • C 过程数据,
    • D 上传结果
    • E 删除消息。

    将 B 到 C 包装在一个 try-catch 中。如果在“无害”的 SQL Azure 调用期间发生了某些事情,只需在不删除消息的情况下退出,它会在可见性超时到期后再次弹出。

    实际上,这是非常常见的方法:组织成类似事务的块,将块包装成 try-catch,在异常时巧妙地回滚。并且永远,永远不要假设某些调用不会失败。所有调用不时失败。

    【讨论】:

    • 我同意你的方法,但大卫斯蒂尔的回答也是正确的。事实上,这两个答案都涉及不同的层次。您使用瞬态故障处理框架来处理瞬态错误;如果情况仍然存在,则中止当前操作并稍后重试(或丢弃)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-23
    • 1970-01-01
    • 2013-09-15
    相关资源
    最近更新 更多