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

如何在.NET Framework中结合DbContext使用Polly重试库

.NET Framework 4.7.1 基于Polly实现DbContext连接重试方案

Polly原生支持.NET Framework 4.7.1,直接通过NuGet安装兼容版Polly即可使用,无需依赖.NET Core相关组件。

实现步骤

  1. 在DbContext所在类中定义可复用的静态连接重试策略,可根据业务调整重试规则和异常捕获范围:
using Polly;
using System.Data.SqlClient;

// 定义为静态字段,避免每次调用重复创建策略
private static readonly Policy _dbConnectionRetryPolicy = Policy
    // 捕获SQL服务异常、连接相关操作异常
    .Handle<SqlException>()
    .Or<InvalidOperationException>(ex => ex.Message.Contains("连接") || ex.Message.Contains("timeout"))
    .WaitAndRetry(
        retryCount: 3, // 最多重试3次
        sleepDurationProvider: retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)), // 指数退避间隔:2s/4s/8s
        onRetry: (exception, timeSpan, retryCount, context) =>
        {
            // 记录重试日志
            LogHelper.LogWarning(
                $"数据库连接失败,第{retryCount}次重试,等待间隔:{timeSpan.TotalSeconds}秒,异常信息:{exception.Message}", 
                LogHelper.Categories.SQService
            );
        }
    );
  1. 修改WebEntities属性的get访问器,将连接打开逻辑包裹进重试策略执行:
public sqweb2Entities WebEntities
{
    get
    {
        if (null == _WebEntities)
        {
            _WebEntities = new sqweb2Entities();
            LogHelper.LogInfo(string.Format("Connecting to Web DB: {0}", _WebEntities.Database.Connection.ConnectionString), LogHelper.Categories.SQService);
        }
        if (_WebEntities.Database.Connection.State != System.Data.ConnectionState.Open)
        {
            _dbConnectionRetryPolicy.Execute(() => 
            {
                // 重试前二次判断连接状态,避免并发场景下重复打开
                if (_WebEntities.Database.Connection.State != System.Data.ConnectionState.Open)
                {
                    _WebEntities.Database.Connection.Open();
                }
            });
        }
        return _WebEntities;
    }
}

注意事项

  • 上述实现仅覆盖了数据库连接打开阶段的重试,如果你需要对查询执行、提交更新等操作也做重试,可参考同样的策略写法,将对应数据库操作逻辑包裹进Policy.Execute方法中即可。
  • 注意过滤不可重试的异常,比如连接字符串配置错误、数据库账号权限不足这类确定性异常,不需要加入重试范围,避免无意义的重试等待。
  • DbContext本身不是线程安全的,如果你当前是单例模式持有_WebEntities实例,建议调整为请求级创建、用完即释放的模式,避免多线程并发操作出现不可预期的问题。

内容的提问来源于stack exchange,提问作者youngseagul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 02:45:00