.NET 6升级后连接AWS MySQL RDS出现调用挂起/超时问题求助
.NET 6+EF Core 6.0.9连接AWS RDS MySQL 5.7挂起问题排查思路
连接字符串与版本配置优化
- 替换
ServerVersion.AutoDetect(connStr)为显式指定版本:new MySqlServerVersion(new Version(5,7,12)),避免RDS环境下版本自动检测的偏差 - 强制添加连接池与超时参数到连接字符串:
其中Max Pool Size=100;Min Pool Size=5;Connection Timeout=30;Connection Lifetime=180;SslMode=RequiredSslMode=Required是AWS RDS的强制要求,升级后的MySqlConnector对SSL校验更严格;连接池参数可排查连接耗尽或回收异常 - 临时添加
Compress=false关闭连接压缩,排除RDS对压缩协议的兼容性问题
EF Core上下文与重试策略调整
- 显式配置上下文生命周期:由于仓储是Transient,可尝试将上下文改为Transient(仅排查用):
services.AddDbContext<LoggingDbContextAdapter>(optionsBuilder => { // 原有配置 }, ServiceLifetime.Transient); - 禁用EF Core的自动重试:在
UseMySql的配置中添加.RetryOnFailure(0),排除0ms间隔的无限重试导致的挂起 - 开启Debug级日志排查连接流程:
重点观察第二次调用时的连接获取、释放日志,确认是否有连接被占用未归还optionsBuilder.LogTo(Console.WriteLine, LogLevel.Debug) .EnableSensitiveDataLogging();
MySqlConnector版本验证
- 确认MySqlConnector版本与EF Core 6.0.9兼容(推荐2.2.6~2.2.10版本),若当前版本过高,尝试降级到该区间;若过低则升级到最新兼容版
- 可临时切换到Pomelo.EntityFrameworkCore.MySql的稳定版本对比测试,排除组件本身的隐性bug
RDS与网络侧验证
- 登录RDS执行
show processlist;,查看连接状态,确认是否有大量Sleep连接未释放,或连接数达到实例上限 - 添加
TcpKeepAlive=60到连接字符串,保持TCP连接活跃,避免.NET 6的TCP参数变化导致连接被RDS主动断开
内容的提问来源于stack exchange,提问作者Ralph
相关产品推荐
相关产品推荐

