【EF 译文系列】韧性连接、重试(EF 版本至少为 6)
原文链接: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)的更多相关文章
- 【EF 译文系列】重试执行策略的局限性(EF 版本至少为 6)
原文链接:Limitations with Retrying Execution Strategies (EF6 onwards) 当使用重试执行策略的时候,大体有以下两种局限性: 不支持以流的方式进 ...
- 【EF 译文系列】模型和数据库连接
原文链接:Connections and Models 本篇文章主要包括 Entity Framework 是如何选择数据库进行连接,以及我们如何去改变它的连接.无论是通过 Code First 还 ...
- 【Basics of Entity Framework】【EF基础系列1】
EF自己包括看视频,看MSDN零零散散的学了一点皮毛,这次打算系统学习一下EF.我将会使用VS2012来学习这个EF基础系列. 现在看看EF的历史吧: EF版本 相关版本特性介绍 EF3.5 基于数据 ...
- EF和MVC系列文章导航:EF Code First、DbContext、MVC
对于之前一直使用webForm服务器控件.手写ado.net操作数据库的同学,突然来了EF和MVC,好多新概念泉涌而出,的确犹如当头一棒不知所措.本系列文章可以帮助新手入门并熟练使用EF和MVC,有了 ...
- EF内容记录_EF连接Mysql版本问题
EF连接MySQL可用版本,由于EF.MySQLConnection.mysql-for-visualstudio.VS版本.MySQL.Data.MySQL.Data.Entity版本问题较花时间, ...
- 1.翻译:EF基础系列--什么是Entity Framework?
大家好,好久不见,EF系列之前落下了,还是打算重新整理一下. 先说说目前的打算:先简单了解一下EF基础系列-->然后就是EF 6 Code-First系列-->接着就是EF 6 DB-Fi ...
- 10.翻译:EF基础系列---EF中的持久性
原文链接:http://www.entityframeworktutorial.net/EntityFramework4.3/persistence-in-entity-framework.aspx ...
- asp.net EF core 系列 作者:懒懒的程序员一枚
asp.net core 系列 19 EFCore介绍写作逻辑一 .概述1.1 比较EF Core 和EF61.2 EF Core数据库提供程序 1.3 引用程序添加数据库提供程序1.4 获取Enti ...
- EF中的开放式并发(EF基础系列--28)
好久没更新EF这个系列了,现在又重新开始. 这次学习,开放式并发.首先拿出数据库脚本: 说明一下,这个数据库脚本是之前的章节中稍作修改的: USE [SchoolDB] GO /****** Obje ...
随机推荐
- Codeforces Round #381 (Div. 1) B. Alyona and a tree dfs序 二分 前缀和
B. Alyona and a tree 题目连接: http://codeforces.com/contest/739/problem/B Description Alyona has a tree ...
- python 与数据结构
在上面的文章中,我写了python中的一些特性,主要是简单为主,主要是因为一些其他复杂的东西可以通过简单的知识演变而来,比如装饰器还可以带参数,可以使用装饰类,在类中不同的方法中调用,不想写的太复杂, ...
- cocos2d-x-3.0 的改变,由于变得太多,一点点累积吧!
1.cpp 改成 Point 2.setIsRelativeAnchorPoint() 改成 ignoreAnchorPointForPosition() 3.Layer::create 图 ...
- URL 学习总结
1.绝对路径(以"/"斜线开头的路径,代表相对于当前Web应用): a)地址给服务器用,web应用名称可以省略. 请求包含:request.getRequestDispatcher ...
- AD10长方形通孔焊盘的画法
1.点击工具栏中[放置焊盘]按钮 2.按键盘Tab键弹出[焊盘]对话框 3.设置[空洞信息]相关尺寸(根据自己所需实际设置) 这里左边的单选按钮选择“槽”,通孔尺寸输入20mil,长度为80mil,旋 ...
- JAVA笔记 之 Thread线程
线程是一个程序的多个执行路径,执行调度的单位,依托于进程存在. 线程不仅可以共享进程的内存,而且还拥有一个属于自己的内存空间,这段内存空间也叫做线程栈,是在建立线程时由系统分配的,主要用来保存线程内部 ...
- 现代JavaScript开发者的工具箱
自从HTML5变得流行以来,整个Web平台取得了长足的进步,人们也开始将JavaScript视为一门能够创建复杂应用的语言.许多新的API纷纷浮现,而关于浏览器如何应用这些技术的文章也大量涌现. 作为 ...
- Linux探秘之I/O效率
一.文章来由 最近看了<UNIX环境高级编程>,对以前比较模糊的一些知识结构又做了进一步的加强,特别是前两章讲到不带缓冲的文件I/O和带缓冲的标准I/O,对read.write.fread ...
- C#基础总结之七面向对象知识点总结1
class Class //定义一个类 名字是Class { ; string NAME; string deptName; ; //如果是常量 只能获取,不能赋值 public string Nam ...
- Delphi 10.1 Berlin Starter Edition
Delphi 10.1 Berlin Starter Edition Embarcadero® Delphi 10.1 Berlin Starter is a great way to get sta ...