添加EnableRetryOnFailure后无法连接到Web服务器%server name%的问题
问题分析与解决
核心问题
添加o => o.EnableRetryOnFailure()后出现无法连接Web服务器的错误,本质是EF Core重试策略与单例DbContextFactory的生命周期冲突,叠加MariaDB版本识别的潜在问题导致。
解决步骤
1. 修正DbContextFactory的生命周期
当前使用的ServiceLifetime.Singleton与重试策略不兼容——EnableRetryOnFailure()依赖的执行策略组件需要Scoped/Transient级别的资源,单例模式会导致资源持有异常,进而引发连接故障。修改为Scoped生命周期:
services.AddDbContextFactory<AsterixDBContext>( options => options.UseMySql(connectionAsterixDBString, ServerVersion.AutoDetect(connectionAsterixDBString), o => o.EnableRetryOnFailure() ), ServiceLifetime.Scoped); // 替换为Scoped
2. 显式指定MariaDB服务器版本
ServerVersion.AutoDetect()在部分MariaDB版本下可能识别不准确,导致重试策略适配逻辑出错,直接指定对应版本:
// 明确指定MariaDB 11.0.4版本 var serverVersion = new MariaDbServerVersion(new Version(11, 0, 4)); services.AddDbContextFactory<AsterixDBContext>( options => options.UseMySql(connectionAsterixDBString, serverVersion, o => o.EnableRetryOnFailure() ), ServiceLifetime.Scoped);
3. 优化重试策略参数(可选)
若问题仍存在,可给重试策略添加具体参数,避免过度重试耗尽连接池:
o => o.EnableRetryOnFailure( maxRetryCount: 5, // 最大重试次数 maxRetryDelay: TimeSpan.FromSeconds(30), // 最大重试间隔 errorNumbersToAdd: new[] { 1040 } // 补充需要重试的错误码(如连接池满) )
4. 修正连接字符串拼写
注意连接字符串中%severname%为拼写错误(应为%servername%),虽之前能运行,但建议修正避免后续配置问题:
Server=%servername%;Database=asterix-dev;Uid=asterix;Pwd=%password%;default command timeout=300
内容的提问来源于stack exchange,提问作者Gibrid
相关产品推荐
相关产品推荐

