我有一些 C# 代码在遇到 SqlExceptions 时会重试,该代码在 vanilla Web 服务器上运行并与 Sql2k8 数据库通信,这是标准的东西。
我有兴趣将代码移植到 Azure Web 角色,并将数据库移动到 SQL Azure。我发现了一些似乎捕捉到“连接错误”的 EntLib 东西,但我不知道企业库代码在我自己的位上提供了什么...... SqlExceptions 是 SqlExceptions,对吗?
我有一些 C# 代码在遇到 SqlExceptions 时会重试,该代码在 vanilla Web 服务器上运行并与 Sql2k8 数据库通信,这是标准的东西。
我有兴趣将代码移植到 Azure Web 角色,并将数据库移动到 SQL Azure。我发现了一些似乎捕捉到“连接错误”的 EntLib 东西,但我不知道企业库代码在我自己的位上提供了什么...... SqlExceptions 是 SqlExceptions,对吗?
我想在 Grigori 的回答之上添加几件事。
瞬态故障处理应用程序块具有 SQL Azure 的默认重试策略,它将帮助您覆盖 SqlExceptions,只有 SQL 数据库将抛出(不是 SQL Server 数据库)保证连接重试。重要的原因是您应该只对保证重试的 SqlException 执行连接重试。这是使用应用程序块的好处之一。
然而......尽管应用程序块非常有用,但 SqlExceptions 只是您将在云中遇到的一种错误:由 SQL 数据库生成的错误。您可能(将)需要捕获其他类型的错误以确保连接重试的完整性,例如某些 IO 异常,这些错误是负载平衡器或位于您和 SQL 数据库之间的其他中间代理层的结果。此信息没有权威来源;只是个人经验。然而,好消息是有一种方法(或者我应该说曾经有一种方法使用原始重试框架)来自定义应用程序块以包含您希望重试策略处理的异常类型。由于我没有使用最新版本,因此请务必提出此要求……以防万一事情发生变化。
因此,应用程序块提供了一种灵活的方式来管理您的连接重试策略,而不管您连接到的 SQL 数据库引擎如何,并且可以很好地控制您实际想要重试的异常列表。对于具有非常集中的连接逻辑并且只处理 SQL 数据库的应用程序来说,这可能是一种过度杀伤,但它是一个非常强大的框架。
您似乎指的是我们作为 Windows Azure 企业库集成包的一部分提供的瞬态故障处理应用程序块。它不仅包括 SQL Azure 的检测策略,还包括 Windows Azure 存储、缓存和服务总线以及一组可扩展的重试策略。这个想法是在使用的多种技术中具有一致的重试行为。
当然,如果您只关心 SqlExceptions,您可以使用自己的检测代码。