阿里云服务器有时会出现短暂的连接不上数据库服务器(RDS)的问题,之前由于没有启用 Entity Framework Core 的失败重试功能(默认是禁用的),短暂的连接失败立马会引发下面的异常从而出现500错误。

System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server)

为了解决这个问题,在 Startup 中添加如下的代码启用 RetryOnFailure 。

services.AddDbContext<CnblogsDbContext>(options =>
{options.UseSqlServer(Configuration.GetConnectionString("cnblogs"),builder =>{builder.EnableRetryOnFailure(maxRetryCount: 5,maxRetryDelay: TimeSpan.FromSeconds(30),errorNumbersToAdd: null);});
});

但是测试发现不起作用。

期望的测试结果是这样的:启动 asp.net core 站点 ->  curl 发请求 -> 正常响应 -> 停止 SQL Server 服务器 -> curl 发请求 -> 等待 -> 30秒之后启动 SQL Server -> 正常响应。

实际的测试结果却是这样:启动 asp.net core 站点 ->  curl 发请求 -> 正常响应 -> 停止 SQL Server 服务器 -> curl 发请求 -> 15秒左右出现500错误,报上面的异常。

难道这个异常不在 RetryOnFailure 的默认范围?

于是通过 errorNumbersToAdd 添加 0x80131904 错误码:

var errorNumer = 0x80131904;
builder.EnableRetryOnFailure(maxRetryCount: 5,maxRetryDelay: TimeSpan.FromSeconds(30),errorNumbersToAdd: new int[] { (int)errorNumer });

却依然不起作用。

别无他法,只能硬啃 EFCore 的源代码找线索了,于是找到 SqlServerTransientExceptionDetector

public class SqlServerTransientExceptionDetector
{public static bool ShouldRetryOn([NotNull] Exception ex){if (ex is SqlException sqlException){foreach (SqlError err in sqlException.Errors){switch (err.Number){case 49920:case 49919:case 49918:case 41839:case 41325:case 41305:case 41302:case 41301:case 40613:case 40501:case 40197:case 10929:case 10928:case 64:case 20:}}return false;}if (ex is TimeoutException){return true;}return false;}
}

原来是根据 SqlError.Number 来判断的, 上面的数字都这么小,看来 0x80131904 不是 SqlError.Number ,再次查看错误日志发现在 System.Data.SqlClient.SqlException (0x80131904) 之前有下面一行日志:

Error Number:2,State:0,Class:20

原来是 2 ,于是在 errorNumbersToAdd  中添加这个 error number ,问题就解决了。

services.AddDbContext<CnblogsDbContext>(options =>
{options.UseSqlServer(Configuration.GetConnectionString("cnblogs"),builder =>{builder.EnableRetryOnFailure(maxRetryCount: 5,maxRetryDelay: TimeSpan.FromSeconds(30),errorNumbersToAdd: new int[] { 2 });});
});

使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题相关推荐

  1. ef core mysql 字符集,EF Core 基础知识

    数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...

  2. 【ASP.NET Core】EF Core 模型与数据库的创建

    大家好,欢迎收看由土星卫视直播的大型综艺节目--老周吹逼逼. 今天咱们吹一下 EF Core 有关的话题.先说说模型和数据库是怎么建起来的,说装逼一点,就是我们常说的 "code first ...

  3. EF Core 异步编程注意要点

    ????欢迎点赞 :???? 收藏 ⭐留言 ???? 如有错误敬请指正,赐人玫瑰,手留余香! ????本文作者:由webmote 原创, ????作者格言:生活在于折腾,当你不折腾生活时,生活就开始折 ...

  4. ABP Framework:移除 EF Core Migrations 项目,统一数据上下文

    原文:Unifying DbContexts for EF Core / Removing the EF Core Migrations Project[1] 导读:软件开发的一切都需要平衡 在 AB ...

  5. EF Core中高效批量删除、更新数据的Zack.EFCore.Batch发布三个新特性

    Zack.EFCore.Batch是一个支持在Entity Framework Core中高效删除和更新数据的开源库.我们知道,EF Core中不支持高效的删除和更新数据,所有的更新和操作都是逐条数据 ...

  6. 杨中科.NET5视频教程更新了:DI、配置系统、Logging、EF Core等

    我的.NET5视频教程又更新了一些内容了,包含依赖注入.配置系统.日志系统以及部分Entity Framework Core的内容.Entity Framework Core还没全讲完,会继续更新. ...

  7. 跟我一起学.NetCore之EF Core 实战入门,一看就会

    前言 还记得当初学习数据库操作时,用ADO.NET一步一步地进行数据操作及查询,对于查询到的数据还得对其进行解析,然后封装返回给应用层:遇到这种重复而繁琐的工作,总有一些大神或团队对其进行封装,从而出 ...

  8. 国产化之路-统信UOS /Nginx /Asp.Net Core+ EF Core 3.1/达梦DM8实现简单增删改查操作

    引言 经过前期的准备工作,.net core 3.1的运行环境和WEB服务器已经搭建完毕,这里需要注意一下,达梦DM8数据库对于Entity Framework Core 3.1 的驱动在NuGet官 ...

  9. EF Core 3.0查询

    随着.NET Core 3.0的发布,EF Core 3.0也随之正式发布,关于这一块最近一段时间也没太多去关注,陆续会去对比之前版本有什么变化没有,本节我们来看下两个查询. 分组 我们知道在EF C ...

最新文章

  1. 【朝花夕拾】Android性能篇之(二)Java内存分配
  2. matlab R2014a添加路径
  3. Android --- TabHost 切换时,改变选项卡下字体的状态(大小、加粗、默认被选中第一个)
  4. MyBatis参数传入集合之foreach动态sql
  5. 【C++】Visual Studio教程(三) - 项目和解决方案
  6. 语义分割和实例分割_语义分割入门的一点总结
  7. python requests form data_python使用requests发送multipart/form-data请求数据
  8. 中国橡胶防老剂4020市场现状与投资预测报告(2022版)
  9. systrace介绍
  10. 全面讲解光纤、光模块、光纤交换机、光模块组网设计与案例
  11. 不必再狂按空格键了!Word 里文字对齐推荐这4种方法
  12. php is_subclass_of,PHP is_subclass_of() 函数用法及示例
  13. Springboot 结合 Vue 进行本地接口联调
  14. 【前端】页面适配?移动端适配屏幕的各种解决方案!
  15. 一个简单的JS(盒子移动)
  16. 【智力题】小环绕大环
  17. 何为Agile,何为Scrum
  18. centos7 磁盘分区
  19. 腾讯云多人视频会议 TUIRoom 功能体验
  20. 金蝶盘点机PDA条码管理系统WMS系统具体有哪些常用功能模块

热门文章

  1. 华为应用市场 AppGallery Connect 研习社·直播:百万开发者打造优质应用的奥秘
  2. Centos7安装Miniconda及配置jupyter
  3. mysql主从以及读写分离(科普)
  4. 来,加入前端自动化单元测试
  5. 5G时代渐行渐近 移动承载网络面临新挑战
  6. ZOJ 2913 Bus Pass (近期的最远BFS HDU2377)
  7. 【Spring实战】—— 3 使用facotry-method创建单例Bean总结
  8. oracle创建简单的包
  9. Lync 小技巧-24-PDF 加密文件-转-Word-操作手册
  10. Modules in Node