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的核心程序代码中,可以断开会话状态并在适当的时候恢复会话,不少场景都会收益于这个功能.html
ADO.NET Idle Connection Resiliency这个功能被包装在Entity Framework 6中,在DbConfiguration设定DbExecutionStrategy对象,Entity Framework 6内建了四种不一样的DbExecutionStrategy[http://msdn.microsoft.com/pt-BR/data/dn456835],分别是: git
类github |
说明算法 |
DefaultExecutionStrategysql |
执行时不包含重试策略,这会自动用于SQL Server之外的数据库。数据库 |
DefaultSqlExecutionStrategy编程 |
执行时不包含重试策略,可是它会包装例外情况,由使用者决定是否要启用Connection Resiliency。框架 |
DbExecutionStrategy异步 |
这个对象是全部执行策略的基础类别,它包装了指数式重试原则 (exponential retry policy) 算法,而且由实做来决定要如何使用这个算法,以及重试的次数等。async |
SqlAzureExecutionStrategy |
专为SQL Azure Database设计的重试策略,会依照已知的可能瞬断问题进行自动的重试处理。 |
使用 IDbConnectionStrategy 能够配置重试次数。 EF 中包含的 SQL Server 提供程序用来指定 default:SqlServerExecutionStrategy,它会显示错误消息告知调整瞬态链接引起异常的策略。 另一个策略 SqlAzureExecutionStrategy 经过微调能够链接 Windows Azure SQL 数据库。
最简单的策略指定方法是使用新的 DbConfiguration 类,使用该类能够很容易配置特定数据库提供程序的行为。 如下命令可让 EF 针对 SqlClient 使用 SQLAzureExecutionStrategy:
- SetExecutionStrategy (SqlProviderServices.ProviderInvariantName,
- () => new SqlAzureExecutionStrategy());
不只链接策略能够配置,并且您还能够本身建立策略并根据须要经过编程暂停使用它们。
上文提到的 Transient Fault Framework 其实Enterprise Library的一个模块。这个框架考虑到了处理全部可能的瞬态错误的需求,在内部实现了一个“Retry Policy”来确保只处理须要的错误。在客户进入重试状态前会使用策略验证这个异常是否属于瞬态错误。
下面是几个相似的项目: