实体框架 - SQL Azure重试策略

时间:2011-04-18 13:12:29

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

有人可以指导我如何使用EF to SQL Azure实现重试策略。

5 个答案:

答案 0 :(得分:9)

我使用的是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 :(得分:9)

Entity Framework 6已添加连接弹性作为新功能,以帮助解决此问题,引用Microsoft:&#34; 支持从瞬时连接失败中自动恢复 &#34 ;.如果您想了解更多信息,请参阅Connection Resiliency Spec for EF6

EF6 at NuGet

答案 2 :(得分:3)

根据大多数文档使用Transient Fault Handling库的问题在于它强制您在应用程序中包装每个数据库调用。

如果您使用Entity Framework 6(目前处于alpha版本),那么Azure SQL数据库的瞬态重试有一些新的内置支持(稍加配置):这里是link

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

这允许您将它用于Entity Framework或Linq To Sql,这里是 link

答案 3 :(得分:2)

此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 EXCEPTION错误号。还有一个计数器,基本上可以防止它永远“重试”。

答案 4 :(得分:1)

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

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