【问题标题】:Entity Framework - SQL Azure Retry Policy实体框架 - SQL Azure 重试策略
【发布时间】:2016-05-03 06:49:26
【问题描述】:

请谁能指导我如何使用 EF 对 SQL Azure 实施重试策略。

【问题讨论】:

    标签: c# sql entity-framework azure-sql-database


    【解决方案1】:

    我正在使用Transiet Fault Handling Framework,这是 EF 团队提供的更好的解决方案。

    • 将二进制文件或上述链接中的项目添加到您的解决方案中,并添加对您项目的引用。
    • 使用合适的参数实例化重试策略:

        var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
                10, 
                TimeSpan.FromSeconds(0.5), 
                TimeSpan.FromSeconds(2)
        ) { FastFirstRetry = true };
    
    • 将您的重试策略对象用于context 上的任何原子工作。

        using(var context = new ... )
        {
            ...//Maybe you do something to the database...
            retryPolicy.ExecuteAction(() => context.SaveChanges());
        }
    

    【讨论】:

    • +1 我知道这个问题现在已经很老了,但是在提到瞬态故障处理框架方面做得很好。我已经在生产环境中使用它一段时间了,它对我来说效果非常好。
    • 如果您在 TransactionScope 中执行 SaveChanges(),则必须非常小心地使用此技术,因为在这种情况下,EF 不会将 SaveChanges 包装在 BEGIN / COMMIT 块中,而是依赖于 BEGIN /COMMIT 的事务范围(用 SQLServer profiler 试试看我的意思)。因此,如果 SaveChanges() 执行了 5 次插入并且一次失败,则重试可能会重新插入没有问题的 4 次。这可能是 EF 6 连接弹性不允许用户定义事务的原因:see
    【解决方案2】:

    Entity Framework 6 添加了连接弹性作为一项新功能来帮助解决这个问题,引用 Microsoft 的话:“启用从短暂连接故障中自动恢复”。如果你想了解更多,这里是Connection Resiliency Spec for EF6

    EF6 at NuGet

    【讨论】:

    • 是默认实现的吗?还是我们必须明确启用它?
    • 我认为this 是更新后的链接。
    【解决方案3】:

    根据大多数文档,使用瞬态故障处理库的问题在于,它迫使您将每个数据库调用包装在应用程序中。

    如果您使用 Entity Framework 6(目前处于 alpha 阶段),那么有一些新的内置支持使用 Azure SQL 数据库进行瞬时重试(需要一点配置):这里是 link

    我创建了一个库,它允许您配置实体框架以使用故障处理块重试,而无需更改每个数据库调用 - 通常您只需要更改配置文件和一两行代码。

    这允许您将它用于实体框架或 Linq To Sql,这里是 link

    【讨论】:

      【解决方案4】:

      此 Azure 论坛线程有一些指向涵盖该主题的优秀资源的链接。似乎还没有任何“官方”的东西。但是有一些开源项目可以给你一个很好的开始。

      http://social.msdn.microsoft.com/Forums/en-US/ssdsgetstarted/thread/3a9ed384-5374-438e-a8a4-ff4bd8000738/#27b5251a-bff5-4282-980c-ad43fdd85591

      来自答案:

      http://blogs.msdn.com/b/appfabriccat/archive/2010/10/28/best-practices-for-handling-transient-conditions-in-sql-azure-client-applications.aspx

      我个人没有使用博客提到的库。相反,我能够通过一个简单的 WHILE LOOP 逃脱,它带有一个 TRY/CATCH,它监视可以安全重试的特定 SQL 异常错误号。还有一个计数器基本上可以防止它永远“重试”。

      【讨论】:

      • 谢谢 Vyrotek,您能分享一下您的 while 循环 try/catch 吗?
      【解决方案5】:

      Windows Server AppFabric 客户咨询团队在 this blog post 中提供了一些关于重试的相当详细的指导。

      基本上,他们有许多不同的方式来使用瞬态故障处理框架(该框架已被类似的Transient Fault Handling Application Block 取代)以提供重试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2011-05-08
        • 2014-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多