ADO.NET的弹性连接控制[ADO.NET idle connection resiliency]

ADO.NET连接SQL Server有时候联机会无故的中断 (例如闲置过久或是交易时间太长等因素),这时又要重新连接,在.NET Framework 4.5之前,这件事情要由开发人员自己依照ADO.NET的SqlException来判断并自行重试,重试的算法也要由开发人员来自定义,所以SQL Database的CAT (Customer Advisory Team) 开发了Transient Fault Framework给Windows Azure的开发人员使用,而.NET Framework 4.5.1则正式将它纳入ADO.NET的核心程序代码中,能够断开会话状态并在适当的时候恢复会话,很多场景都会收益于这个功能.

ADO.NET Idle Connection Resiliency这个功能被包装在Entity Framework 6中,在DbConfiguration设定DbExecutionStrategy对象,Entity Framework 6内建了四种不同的DbExecutionStrategy[http://msdn.microsoft.com/pt-BR/data/dn456835],分别是:

说明

DefaultExecutionStrategy

执行时不包含重试策略,这会自动用于SQL Server以外的数据库。

DefaultSqlExecutionStrategy

执行时不包含重试策略,但是它会包装例外状况,由使用者决定是否要启用Connection Resiliency。

DbExecutionStrategy

这个对象是所有执行策略的基础类别,它包装了指数式重试原则 (exponential retry policy) 算法,并且由实作来决定要如何使用这个算法,以及重试的次数等。

SqlAzureExecutionStrategy

专为SQL Azure Database设计的重试策略,会依照已知的可能瞬断问题进行自动的重试处理。

使用 IDbConnectionStrategy 可以配置重试次数。 EF 中包含的 SQL Server 提供程序用来指定 default:SqlServer­ExecutionStrategy,它会显示错误消息告知调整瞬态连接引发异常的策略。 另外一个策略 SqlAzureExecutionStrategy 通过微调可以连接 Windows Azure SQL 数据库。

最简单的策略指定方法是使用新的 DbConfiguration 类,使用该类可以很容易配置特定数据库提供程序的行为。 以下命令可以让 EF 针对 SqlClient 使用 SQLAzureExecutionStrategy:

          SetExecutionStrategy (SqlProviderServices.ProviderInvariantName,
  () => new SqlAzureExecutionStrategy());        

不仅连接策略可以配置,而且您还可以自己创建策略并根据需要通过编程暂停使用它们。

上文提到的 Transient Fault Framework 其实Enterprise Library的一个模块。这个框架考虑到了处理所有可能的瞬态错误的需求,在内部实现了一个“Retry Policy”来确保只处理需要的错误。在客户进入重试状态前会使用策略验证这个异常是否属于瞬态错误。

  • 提供了一个可扩展的Retry逻辑处理瞬态错误,不仅限于SQL Server。
  • 支持一系列的重试方案(固定周期,渐进周期,随机指数退避)
  • 支持SQL 连接和SQL命令使用不同的Retry策略。
  • SqlConnectionSqlCommand对象提供了扩展方法来实现Retry操作
  • 支持Retry后的回调,通知用户代码是否发生了Retry情况
  • 支持快速重试模式,当第一次发生进行Retry时会立即尝试而没有延迟
  • 允许在应用程序配置文件中定义Retry策略
  • 支持同步和异步请求

下面是几个类似的项目:

译文:SQL Azure客户端-瞬态错误处理最佳实践

基于Enterprise Library 6 的AOP实现

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏逸鹏说道

Win10 UWP应用发布流程

简介 Win10 UWP应用作为和Win8.1 UAP应用不同的一种新应用形式,其上传至Windows应用商店的流程也有了一些改变。 这篇博文记录了我们发布一款...

2465
来自专栏.NET后端开发

ADO.NET入门教程(二)了解.NET数据提供程序

摘要       在上一篇文章《你必须知道的ADO.NET(一) 初识ADO.NET》中,我们知道ADO.NET的两大核心组件分别是Data Provider和...

42211
来自专栏施炯的IoT开发专栏

Windows 10 IoT Serials 3 - Windows 10 IoT Core Ardunio Wiring Mode

    Maker社区和智能硬件的朋友一定知道Arduino,很多3D打印机都是用它做的。为了迎合这一大块市场,微软在基于Intel Galileo的Windo...

1868
来自专栏林德熙的博客

cant found Microsoft.VSSDK.BuildTools.15.0.26201

可以打开 EncodingNormalior\packages 文件夹,删除所有的文件,然后重新编译。

751
来自专栏从零开始学自动化测试

Appium+python自动化9-SDK Manager

前言 SDK Manager到有哪些东西是必须安装的呢? 一、SDK Manager 1.双击打开SDK Manager界面 ? 2.Tools里面前三个是必须...

2996
来自专栏程序你好

SignalR介绍简单示例教程入门版

1404
来自专栏FreeBuf

Office高级威胁漏洞在野利用分析

高级威胁漏洞背景 在高级威胁攻击中,黑客远程投递入侵客户端最喜欢的漏洞是office文档漏洞,就在刚刚结束不久的黑帽子大会上,最佳客户端安全漏洞奖颁给了CVE-...

3287
来自专栏我是攻城师

Jstorm2.1.1集群安装

4014
来自专栏小狼的世界

几款Linux下的日志书写工具

最近将工作环境切换到了Ubuntu 10.04 下,非常怀念原来的 Liver Writer,于是Google了一下,找找看Linux下是否有同样出色的离线博客...

852
来自专栏假装我会写代码

Laravel Bash 别名

1162

扫码关注云+社区

领取腾讯云代金券