要专业系统地学习EF推荐《你必须掌握的Entity Framework 6.x与Core 2.0》。这本书作者(汪鹏,Jeffcky)的博客:https://www.cnblogs.com/CreateMyself/
连接弹性这一节,作者说的不是很多,而且又出现一个polly库,感觉弄下去真的要花不少时间。
这一块我目前没有准备继续去弄,也就简单记录一下我从这一节内容中学到的东西吧。
连接弹性,什么意思呢?就是你数据库的连接要是断开了,那么还有其他的机制还对这一情况做处理。如果说连接一断就随他去了,显然不够有“弹性”。
说到这一点我想到了我在学习node.js时用到的一个启动器,叫forever,当然启动器也有很多种。什么意思呢?如果说你的服务跑起来了,不用启动器的情况,一个小的错误就能造成你服务关闭。那么我用启动器来启动我的项目就不会出来这种情况。
一般很多部署node程序会用到pm2,这个也差不多就是这种功能,它有一个守护进程,让你的网站不至于一个错误就停止了。
所以我就弄不懂IIS中怎么就没听说过有什么启动器。node里面学的东西其实没多少,就是使用各种包,也不用去管具体实现。有点没劲。最有用的就是它和.net程序之间的差异能够让人引发很多思考。
说回EF中连接弹性的问题。其实如果说数据库连接断开了,可能会有很多种情况,可能因为是网络问题啊。那么我们能够想到的应对方法就是去重试。
EF提供了大量有关暂时异常的信息。如果由于任何原因与数据源的连接丢失并且未达到重试限制,那么它将会以和禁用连接弹性相同的方式引发异常。
EF6.X上给与了一下4种连接策略
1.DefaultExceptionStrategy:默认执行策略,当失败时,对除SQL Server 以外的数据库不会进行重试。
2.DefaultSqlExecutionStrategy:根本不会重试,但是会包含任何可能的短暂异常,以通知开发者可能需要启用连接弹性,次类受保护限制。
3.DbExecutionStrategy:此类适用于其他执行策略的基类,以指数实现重试策略,其中初始重试以0计数,并且延迟指数增加,知道命中最大重试计数。次类具有抽象的ShouldRetryOn方法,可以在派生执行策略中实现,以控制应重试哪些异常。
4.SqlAzureExecutionStrategy:该执行策略继承自DbExecutionStrategy,并将重试在使用SqlAzure时可能一直出现的异常。
上面的是书中的原话,我还是得用自己的话说一下,数据源连接丢失,EF默认是有重试的。但是我按照书上的代码写出来,有一些疑问。
来看一下写一个派生自DbExecutionStrategy,首先我了解到,数据库连接丢失,EF会调用哪个方法,那就知道了有这个切入点吧.
ShouldRetryOn方法中我只是加了一句console,还是执行的基类的代码
public class SqlServerExecutionStrategy : DbExecutionStrategy { public SqlServerExecutionStrategy() { } /// <summary> /// 确定指定的异常是否表示临时故障 如果指定的异常被认为是暂时的,则为true,否则为false。 /// </summary> /// <param name="maxRetryCount">最大重试次数</param> /// <param name="maxDelay">最大等待时长</param> public SqlServerExecutionStrategy(int maxRetryCount, TimeSpan maxDelay) : base(maxRetryCount, maxDelay) { } protected override bool ShouldRetryOn(Exception exception) { // 同样的是打印四次 Console.WriteLine("777777777777777777777777777"); throw new NotImplementedException(); } }