使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题
阿里云服务器有时会出现短暂的连接不上数据库服务器(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: ,
maxRetryDelay: TimeSpan.FromSeconds(),
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: ,
maxRetryDelay: TimeSpan.FromSeconds(),
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 :
case :
case :
case :
case :
case :
case :
case :
case :
case :
case :
case :
case :
case :
case :
}
} 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: ,
maxRetryDelay: TimeSpan.FromSeconds(),
errorNumbersToAdd: new int[] { });
});
});
使用 EF Core 的 EnableRetryOnFailure 解决短暂的数据库连接失败问题的更多相关文章
- EF Core反向导航属性解决多对一关系
多对一是一种很常见的关系,例如:一个班级有一个学生集合属性,同时,班级有班长.语文课代表.数学课代表等单个学生属性,如果定义2个实体类,班级SchoolClass和学生Student,那么,班级Sch ...
- EF Core 基础知识
数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...
- 张高兴的 Entity Framework Core 即学即用:(一)创建第一个 EF Core 应用
写在前面 Entity Framework Core (EF Core) 是 .NET 平台流行的对象关系映射(ORM)框架.虽然 .NET 平台中 ORM 框架有很多,比如 Dapper.NHibe ...
- EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)
官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...
- 一步步学习EF Core(2.事务与日志)
前言 上节我们留了一个问题,为什么EF Core中,我们加载班级,数据并不会出来 其实答案很简单,~ 因为在EF Core1.1.2 中我们在EF6.0+中用到的的延迟加载功能并没有被加入,不过在EF ...
- 一步步学习EF Core(3.EF Core2.0路线图)
前言 这几天一直在研究EF Core的官方文档,暂时没有发现什么比较新的和EF6.x差距比较大的东西. 不过我倒是发现了EF Core的路线图更新了,下面我们就来看看 今天我们来看看最新的EF Cor ...
- 在.NET Core类库中使用EF Core迁移数据库到SQL Server
前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...
- 在ASP.NET Core中通过EF Core实现一个简单的全局过滤查询
前言 不知道大家是否和我有同样的问题: 一般在数据库的设计阶段,会制定一些默认的规则,其中有一条硬性规定就是一定不要对任何表中的数据执行delete硬删除操作,因为每条数据对我们来说都是有用的,并且是 ...
- EF Core下利用Mysql进行数据存储在并发访问下的数据同步问题
小故事 在开始讲这篇文章之前,我们来说一个小故事,纯素虚构(真实的存钱逻辑并非如此) 小刘发工资后,赶忙拿着现金去银行,准备把钱存起来,而与此同时,小刘的老婆刘嫂知道小刘的品性,知道他发工资的日子,也 ...
随机推荐
- 【一天一个shell命令】【cut】
1. 命令简介 cut根据指定的定界符,切分文件,并将选中的列输出到标准输出. 2. 用法 cut [选项]... [文件]... 打印输入行的选中的parts 到标准输出 3. 选项 4. 示例 以 ...
- 每天一个linux命令(15):tail命令
1.命令简介 tail (tail) 用来显示档案的结尾(默认为10行)至标准输出中.若指定了多于一个文件,程序会在每段输出的开始添加相应文件名作为头.如果不指定文件或文件为"-" ...
- maven error: element dependency can not have character children
就是Mavn pom.xml的解析错误,因为dependency这个标签中有不可见的垃圾字符,解决方法就是删掉重新打字进去就可以了. references: https://stackoverflow ...
- 发现2017年最好的CSS框架
如今,无数的框架出现在定期而少数人喜欢自助,Foundation和angular.js主宰了整个世界的发展.CSS代表用于描述HTML(或XML)文档表示的样式表语言.一个框架被定义为一个包,它由一组 ...
- Debug 路漫漫-07
201811—201903??? 1)关于训练参数是复数的问题 ——q_k ^theta q_k(是item的特征矩阵)中有可能是负数,而指数 theta 如果是含小数点的话,就会产生复 ...
- 自建证书配置HTTPS服务器
1.写这篇博客的初衷是因为最近iOS9出来了,苹果官方默认要求使用HTTPS,所以自己想整一个HTTPS服务器,也想好好了解一下HTTPS通信,也知道了HTTPS其实就是在HTTP的基础上加上了SSL ...
- spring mvc 传入中文参数乱码问题解决
一个简单的学习springmvc的demo中,当http请求传入中文参数时,在controller中接受到的参数就已经是乱码了,经百度一番解决方案如下: 1. get请求方式乱码解决 对于get方式, ...
- Fluent动网格【12】:扩散光顺
扩散光顺是Fluent提供的另外一种常用的网格光顺方法.其基本原理是通过求解扩散方程得到网格节点的运动位移. 扩散光顺基本计算 扩散光顺通过求解 以下扩散方程来设置网格的节点位置. \[ \nabla ...
- [python] ThreadPoolExecutor线程池 python 线程池
初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程 ...
- XMind8 破解激活教程(最详细,一定是有效的!!!)
下载安装包 首先去xmind国外官网下载对应操作系统的安装包,国内官网的那个是有残缺的,不支持破解. 点击链接进行下载安装包:https://pan.baidu.com/s/1VITXSEQvwGDi ...