有人可以指导我如何使用EF to SQL Azure实现重试策略。
答案 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。
答案 2 :(得分:3)
根据大多数文档使用Transient Fault Handling库的问题在于它强制您在应用程序中包装每个数据库调用。
如果您使用Entity Framework 6(目前处于alpha版本),那么Azure SQL数据库的瞬态重试有一些新的内置支持(稍加配置):这里是link
我创建了一个库,允许您配置实体框架以使用故障处理块重试,而无需更改每个数据库调用 - 通常您只需要更改配置文件,可能需要更改一行或两行代码。
这允许您将它用于Entity Framework或Linq To Sql,这里是 link
答案 3 :(得分:2)
此Azure论坛主题包含一些指向此主题的良好资源的链接。似乎还没有任何“正式”的东西。但是有一些开源项目给你一个很好的开始。
答案:
我个人没有使用博客提到的图书馆。相反,我能够通过一个简单的WHILE LOOP来获取一个TRY / CATCH,它可以查看可以安全重试的特定SQL EXCEPTION错误号。还有一个计数器,基本上可以防止它永远“重试”。
答案 4 :(得分:1)
Windows Server AppFabric客户咨询团队针对this blog post中的重试提供了一些相当详细的指导。
基本上,他们有多种不同的方式使用瞬态故障处理框架(由Transient Fault Handling Application Block取代,后者类似)以提供重试。