实体框架 - SQL Azure重试策略

Nil*_*Pun 15 c# sql entity-framework azure-sql-database

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

Gle*_*eno 9

我使用的是Transiet故障处理框架,由EF团队提供更好的解决方案.

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

    var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
            10, 
            TimeSpan.FromSeconds(0.5), 
            TimeSpan.FromSeconds(2)
    ) { FastFirstRetry = true };
Run Code Online (Sandbox Code Playgroud)
  • 使用重试策略对象进行任何原子工作context.

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


Ber*_*ern 9

实体框架6增加了连接弹性作为一项新功能来帮助解决这个问题,引用微软的话说:"支持从瞬态连接故障中自动恢复 ".如果您想了解更多信息,请参阅 EF6连接弹性规范.

NuGet的EF6


Vyr*_*tek 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

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