【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 ...
随机推荐
- Asp.net Core 使用Redis存储Session
前言 Asp.net Core 改变了之前的封闭,现在开源且开放,下面我们来用Redis存储Session来做一个简单的测试,或者叫做中间件(middleware). 对于Session来说褒贬不一, ...
- Infer初体验 for Android
安装Python Infer下载地址:https://github.com/facebook/infer 配置环境变量 vi ~/.bash_profile #infer export PATH=${ ...
- 表单验证Jquery扩展方法类
/** 表单数据验证 **/ $.fn.Validform = function () { var Validatemsg = ""; var Validateflag = tru ...
- [Lua]50行代码的解释器,用来演示lambda calculus
嗯,来写写经过: 在知乎上看见用Belleve牛用javascript写了一个精简的lisp解释器 => 我也想写一个,用lua写,能多简单呢? => 写了一个阉割的scheme解释器,包 ...
- linux 文件夹说明,用户添加删除,不熟悉的命令
一.Linux 根目录下的文件夹说明 usr 程序默认安装路径,相当于windows的 program 附显示当前所处位置:pwd 二.用户 用户添加:useradd 用户名 passwd 用户名 u ...
- 使用dynamic类型改进反射
首先还是声明一下,使用场景: 1.如果编译时函数名称确定,对象类型运行时确定,那么运用dynamic是一个好主意.2.如果编译时函数名称确定,对象类型在编译时也确定,那就既不需要反射也不需要dynam ...
- android studio 中查找代码中的硬编码
在Android Studio中同时按下Ctrl + Shift+ F 或者其他自定义的快捷键,打开全局搜索,在全局搜索中输入 ^((?!(\*|//)).)+[\u4e00-\u9fa5] 并打勾 ...
- ./adb: cannot execute binary file:
问题描述: 在32位ubuntu(12.04)上下载了最新的android SDK,使用SDK manager 下载ADB之后发现,无法运行ADB命令,排除权限问题,在网上搜到答案: http://a ...
- javascript不用new关键字创建对象示例
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- Hadoop - Kylin On OLAP
1.概述 Apache Kylin是一个开源的分布式分析引擎,提供SQL接口并且用于OLAP业务于Hadoop的大数据集上,该项目由eBay贡献于Apache. 2.What is Kylin 在使用 ...