原文链接:Connection Resiliency / Retry Logic (EF6 onwards)

一个应用程序的数据库连接,是非常容易受其它因素影响的,比如后端的异常或者不稳定的网络连接等。但是,一般在局域网中连接的数据库服务器,这些连接错误是很少发生的,所以处理连接错误的逻辑也就不是必须的。随着越来越多基于云的数据库服务器出现,例如 Window Azure SQL 数据库,如果连接在不可靠的网络环境下,这些连接错误会非常常见。这些可能是由于数据库服务器为了保证服务的公平性而作出的一些保护性处理,比如对连接的限流,或者是不稳定的网络连接导致间歇性的连接超时和一些其它短暂性的错误。

韧性连接,便是指 EF 在执行命令时遇到上诉原因导致连接中断会自动重试执行的一个连接。

执行策略

连接的重试是由 IDbExecutionStrategy 接口的实现来负责, IDbExecutionStrategy 接口的实现会在某个操作出现异常时,来判定是否适合重试,如果适合则会进行重试。EF 提供了 4 种执行策略:

DefaultExecutionStrategy:这个执行策略不会进行任何的重试操作,这是除了 Sql Server 外,其它数据库默认的执行策略。

DefaultSqlExecutionStrategy:这是一个内部默认使用的执行策略,这个策略也不会进行任何的重试操作,但是,它会将这些连接错误的异常包裹起来,并通知用户可能需要开启韧性连接。

DbExecutionStrategy:这个类是一个比较适合用来实现自定义执行策略的基类,它实现了一个指数重试的策略,即,第一次尝试连接时等待为零,后续等待时间以指数级进行增长,直到达到最大尝试次数才终止。这个类有一个抽象方法 ShouldRetryOn ,子类在实现它时,自己决定哪些个异常需要进行重试操作。

SqlAzureExecutionStrategy:这个执行策略继承至 DbExecutionStrategy,它会在 Sql Azure 遇到短暂错误时进行重试操作。

注意:执行策略 2 和 4 包含在 EF 的 Sql Server Provider 中,即 EntityFramework.SqlServer 程序集里。

启用执行策略

告诉 EF 启用执行策略的最简单的方式是使用 DbConfiguration 类的 SetExecutionStrategy 方法:

    public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
}
}

这段代码告诉了 EF,如果连接到 SQL Server,则将使用 SqlAzureExecutionStrategy 执行策略。

译者注:可使用 DbConfigurationTypeAttribute 特性来标记 DbContext,以启用相应的 DbConfiguration。

配置执行策略

SqlAzureExecutionStrategy 的构造函数可以接受两个参数,MaxRetryCount 和 MaxDelay。MaxRetryCount 是这个执行策略能够重试执行的最大次数,MaxDelay 是一个 TimeSpan 类型,代表从这个策略执行开始最大允许的重试执行时间(即所有重试时间的总和)。

设定最大尝试次数为 1,最大执行延时为 30 秒,则你可以编写如下代码:

    public class MyConfiguration : DbConfiguration
{
public MyConfiguration()
{
SetExecutionStrategy(
"System.Data.SqlClient",
() => new SqlAzureExecutionStrategy(1, TimeSpan.FromSeconds(30)));
}
}

SqlAzureExecutionStrategy 会在第一次出现短暂性错误时,立即进行重试,后续重试的间隔时间将会越来越长,直到超过了最大允许的重试次数,或总共的重试时间超过了最大允许的尝试时间。

执行策略只会在一些常见的短暂性错误导致的异常时,进行重试,也就是说,你还需要自己手动的去处理一些其它错误,以及一些非短暂性错误或很难断定是否为短暂性的错误导致的异常。

局限性

当你使用执行策略时,这里有一些已知的局限性。如果你手动的使用了事务,或使用了流(Stream)替代缓冲(Buffer)进行查询,你可能需要查看更多关于这方面的内容

【EF 译文系列】韧性连接、重试(EF 版本至少为 6)的更多相关文章

  1. 【EF 译文系列】重试执行策略的局限性(EF 版本至少为 6)

    原文链接:Limitations with Retrying Execution Strategies (EF6 onwards) 当使用重试执行策略的时候,大体有以下两种局限性: 不支持以流的方式进 ...

  2. 【EF 译文系列】模型和数据库连接

    原文链接:Connections and Models 本篇文章主要包括 Entity Framework  是如何选择数据库进行连接,以及我们如何去改变它的连接.无论是通过 Code First 还 ...

  3. 【Basics of Entity Framework】【EF基础系列1】

    EF自己包括看视频,看MSDN零零散散的学了一点皮毛,这次打算系统学习一下EF.我将会使用VS2012来学习这个EF基础系列. 现在看看EF的历史吧: EF版本 相关版本特性介绍 EF3.5 基于数据 ...

  4. EF和MVC系列文章导航:EF Code First、DbContext、MVC

    对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...

  5. EF内容记录_EF连接Mysql版本问题

    EF连接MySQL可用版本,由于EF.MySQLConnection.mysql-for-visualstudio.VS版本.MySQL.Data.MySQL.Data.Entity版本问题较花时间, ...

  6. 1.翻译:EF基础系列--什么是Entity Framework?

    大家好,好久不见,EF系列之前落下了,还是打算重新整理一下. 先说说目前的打算:先简单了解一下EF基础系列-->然后就是EF 6 Code-First系列-->接着就是EF 6 DB-Fi ...

  7. 10.翻译:EF基础系列---EF中的持久性

    原文链接:http://www.entityframeworktutorial.net/EntityFramework4.3/persistence-in-entity-framework.aspx ...

  8. asp.net EF core 系列 作者:懒懒的程序员一枚

    asp.net core 系列 19 EFCore介绍写作逻辑一 .概述1.1 比较EF Core 和EF61.2 EF Core数据库提供程序 1.3 引用程序添加数据库提供程序1.4 获取Enti ...

  9. EF中的开放式并发(EF基础系列--28)

    好久没更新EF这个系列了,现在又重新开始. 这次学习,开放式并发.首先拿出数据库脚本: 说明一下,这个数据库脚本是之前的章节中稍作修改的: USE [SchoolDB] GO /****** Obje ...

随机推荐

  1. 计算空间直线与平面的交点 (C#)

    public class NGlbVec3d    {// 三维点        public double x, y, z;        public NGlbVec3d()        {   ...

  2. 在java项目中使用log4j的实例

    测试log4j的项目结构 Log4j.properties的路径为    src/config/log4j Log4j.properties文件的内容 下面定义日志输出级别是 INFO,并且配置了2个 ...

  3. WPF中System.Diagnostics.Process.Start的妙用

    我们经常会遇到在Winform或是WPF中点击链接或按钮打开某个指定的网址, 或者是需要打开电脑中某个指定的硬盘分区及文件夹, 甚至是"控制面板"相关的东西, 那么如何做呢? 答案 ...

  4. Apache shiro

    Shiro 是一个 Apache Incubator 项目,旨在简化身份验证和授权. 学习博客:http://jinnianshilongnian.iteye.com/blog/2018398

  5. 【C】——幻方算法

    一.幻方按照阶数可分成了三类,即奇数阶幻方.双偶阶幻方.单偶阶幻方. 二.奇数阶幻方(劳伯法) 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中:按以下规律排列剩下的( ...

  6. android: adapter getView(position==0) was invoked many times.

    this is a big problem for me. i follow the solutions that i  searched from the internet: modify the ...

  7. Node.js之绝对选择

    几年前,完全放弃Asp.net,彻底脱离微软方向.Web开发,在公司团队中,一概使用Node.js.Mongodb.Git,替换Asp.net mvc.Sql server和Tfs.当时来看,这是高风 ...

  8. 修改windows密码后ssrs报错

    昨夜修改了windows的登录密码,第二日发现ssrs全部无法访问.显示filenotfound等错误.细想一下,应该是修改了windows的密码导致ssrs权限验证失败. 因此将ssrs的服务帐号修 ...

  9. 编写并发程序 Inversion

    做完了 scala parallel 课程作业后,觉得 scala 写并发程序的便捷性是 java 永远都追不上的.scala 的Future 和 Promise,java 里 Future 和 Co ...

  10. python Flask :TypeError: 'dict' object is not callable

    flask 基于Werkzeug .. @moudule.route('/upload', methods=['GET', 'POST']) def upload_file(): global _fl ...