实体框架 - SQL Azure 重试策略

15

请问有谁能指导我如何在EF和SQL Azure中实现重试策略。

5个回答

9
我正在使用由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
+1 我知道这个问题现在已经很老了,但是你提到的瞬态故障处理框架做得很好。我已经在生产中使用它一段时间了,对我来说效果非常好。 - David Steele
1
如果在TransactionScope中使用SaveChanges(),必须非常小心,因为在这种情况下,EF不会将SaveChanges包装在BEGIN/COMMIT块中,而是依赖于事务范围的BEGIN/COMMIT(使用SQLServer分析器进行尝试以了解其含义)。因此,如果SaveChanges()执行了5个插入操作并且其中一个失败了,则重试可能会重新插入没有问题的4个。这可能是为什么EF 6连接恢复不允许用户定义事务的原因: - JohnB

9

默认情况下是否已实现?还是我们必须明确启用它? - Zapnologica
我认为这个链接是更新后的链接。 - BornToCode

3
根据大部分文档所述,使用瞬态故障处理库的问题在于它强制你包装应用程序中的每个数据库调用。如果您使用 Entity Framework 6(目前处于 alpha 版本),则可以通过一些新的内置支持来实现与 Azure SQL 数据库的瞬态重试(需要进行少量配置):这里是 link。我创建了一个库,允许您配置 Entity Framework 使用 Fault Handling 块进行重试,而无需更改每个数据库调用 - 通常只需更改配置文件和可能的一两行代码。这使您可以将其用于 Entity Framework 或 Linq To Sql,这里是 link

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循环和一个TRY/CATCH来避免特定的SQL EXCEPTION错误号码,并且是安全重试的。还有一个计数器,基本上可以防止它永远“重试”。

谢谢Vyrotek,你能分享一下你的while循环try/catch吗? - Nil Pun

1
Windows Server AppFabric客户咨询团队在这篇博客文章中提供了关于重试的相当详细的指导。
基本上,他们有多种不同的使用瞬态故障处理框架(已被瞬态故障处理应用程序块取代,类似)以提供重试的方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接