Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架-SQL Azure重试策略_C#_Sql_Entity Framework_Azure Sql Database - Fatal编程技术网

C# 实体框架-SQL Azure重试策略

C# 实体框架-SQL Azure重试策略,c#,sql,entity-framework,azure-sql-database,C#,Sql,Entity Framework,Azure Sql Database,请告诉我如何使用EF实现SQL Azure的重试策略。此Azure论坛线程有一些链接,指向涵盖此主题的优秀资源。似乎还没有什么“官方”的东西。但是有一些开源项目给了你一个很好的开始 答案如下: 我个人没有使用博客提到的图书馆。相反,我可以通过一个TRY/CATCH来完成一个简单的WHILE循环,该循环监视可以安全重试的特定SQL异常错误号。还有一个计数器,基本上可以防止它永远“重试”。我使用的是EF团队提供的更好的解决方案 将二进制文件或上面链接中的项目添加到您的解决方案中,并将引用添加到

请告诉我如何使用EF实现SQL Azure的重试策略。

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

答案如下:

我个人没有使用博客提到的图书馆。相反,我可以通过一个TRY/CATCH来完成一个简单的WHILE循环,该循环监视可以安全重试的特定SQL异常错误号。还有一个计数器,基本上可以防止它永远“重试”。

我使用的是EF团队提供的更好的解决方案

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


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


基本上,他们有许多不同的方法来使用瞬态故障处理框架(该框架已被替代,类似于)为了提供重试。

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

如果您使用EntityFramework6(目前为alpha),那么在Azure SQL数据库中有一些新的内置支持暂时重试(带有一点配置):下面是

我已经创建了一个库,它允许您配置Entity Framework以使用错误处理块重试,而无需更改每个数据库调用—通常您只需要更改配置文件,可能还需要更改一两行代码

这允许您将其用于实体框架或Linq to Sql,以下是

添加了连接弹性作为一项新功能,以帮助解决此问题,引用Microsoft的话:“支持从暂时连接故障中自动恢复”。如果您想了解更多信息,请参阅下面的示例


谢谢Vyrotek,你能分享一下你的while循环try/catch吗?+1我知道这个问题现在已经很老了,但是在提到瞬态故障处理框架方面做得很好。我已经在生产中使用它有一段时间了,它对我来说非常好。如果在TransactionScope中执行SaveChanges(),则必须非常小心地使用此技术,因为在这种情况下,EF不会将SaveChanges包装在BEGIN/COMMIT块中,而是依赖于事务作用域的BEGIN/COMMIT(用SQLServer profiler试试看我的意思)执行了5次插入,一次失败,重试可能会重新插入没有问题的4次。这可能就是EF 6连接弹性不允许用户定义事务的原因:它是默认实现的吗?还是我们必须显式启用它?我认为是更新的链接。
    var retryPolicy = new RetryPolicy<SqlAzureTransientErrorDetectionStrategy>(
            10, 
            TimeSpan.FromSeconds(0.5), 
            TimeSpan.FromSeconds(2)
    ) { FastFirstRetry = true };
    using(var context = new ... )
    {
        ...//Maybe you do something to the database...
        retryPolicy.ExecuteAction(() => context.SaveChanges());
    }