You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

添加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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:29:56