【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 ...
随机推荐
- 每日英语:Mistrust Between U.S., Malaysia Strains Probe
Mistrust between U.S. and Malaysian air-accident investigators has hampered a multinational probe in ...
- 如何评价微软Connect 2015?[转载]
全部的新闻和公告在这里:News and Announcements at Connect(); //2015微博话题:Sina Visitor System根据题主的理解大致地总结一下……1. Vi ...
- A/B测试
昨天把前段时间开发的二胡调音器的应用发布到了亚马逊应用程序商店,看到了一个A/B测试的标签,了解一下A/B测试的工作原理. A/B测试是一种新兴的网页优化方法,可以用于增加转化率注册率等网页指标. 使 ...
- [原]cocos2d-lua 常用法汇总
1.CCEditBox local back = CCScale9Sprite:create("res/ui/images/im_02.png", CCRect(20, 20, 1 ...
- Android QQ空间浏览图片动画特效的实现(※)
1 http://blog.csdn.net/yangblocker/article/details/12680247 2 photoview 3 nineoldandroid
- HDU 3791 二叉搜索树
二叉搜索树 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...
- [原]Android打包之跨平台打包
Android自动打包流程详细图: 在前面一些博客我们知道了如何通过命令行打包,如何通过Eclipse打包,如何通过编写shell脚本来进行打包,但是这些都不能很好的跨平台进行打包. 因Python本 ...
- 二叉树系列 - 二叉搜索树 - 线性时间内把有序链表转化为BST
引言 本文来自于Google的一道题目: how to merge two binary search tree into balanced binary search tree. how to me ...
- React JS 基础知识17条
1. 基础实例 <!DOCTYPE html> <html> <head> <script src="../build/react.js" ...
- Winform快速开发组件的实现(一)
好久好久没有露面了,呵呵,对于写文章都有点生疏了. 在拿到任何一个项目,不管是b/s的还是c/s,我不会立即开始写代码,我一般会为使这些项目能够快速开发制定一系列的支持组件,虽然可能前期会付出一些代价 ...