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

ASP.Net Core修改数据库密码后连接失败,重启应用才恢复问题排查

问题1:SecurityDbContext未配置自定义执行策略

你当前仅为OrdersContext注册了CustomExecutionStrategy,报错的DeleteUsers操作使用的SecurityDbContext注册时只配置了命令超时,没有关联自定义重试策略,密码变更抛出的SqlException不会进入你的重试逻辑,也就不会触发连接字符串更新逻辑,自然操作失败。
修复示例:

protected override void ConfigureDbContext(IServicecollection services)
{
  services.AddDbContext<SecurityDbContext>(options=>options.UseSqlServer (<Connectionstring>,sqlserveroptions => 
  {
    sqlserverOptions.ExecutionStrategy(x => new CustomExecutionStrategy(x, 10, TimeSpan.FromSeconds(10)));
    sqlserverOptions.CommandTimeout(100);
  }));
}

问题2:已打开的连接未重置、连接池缓存旧密码连接

你在ShouldRetryOn里更新了DbContext的连接字符串,但如果DbContext已经打开了数据库连接,该连接仍是用旧密码建立的,修改连接字符串不会自动重置现有连接。同时默认SqlClient启用了连接池,旧密码的有效连接会被缓存,后续即使使用新连接字符串也可能拿到池子里的旧连接,导致登录持续失败。
修复方案:

  • 更新连接字符串后手动关闭现有连接:executionStrategyDependencies.currentContext.Context.Database.CloseConnection();
  • 可临时在连接字符串中添加Pooling=false验证问题,验证通过后可根据业务场景配置连接池生命周期、定时清理连接池。

问题3:重试逻辑缺少异常过滤、事务重试存在状态残留

  • 当前只要遇到SqlException就重试并更新连接字符串,实际仅登录失败(错误号18456)这类密码相关异常才需要更新密码重试,主键冲突、SQL语法错误等异常不需要重试,直接返回失败即可。
  • 你在执行策略回调中开启事务执行SaveChanges,第一次执行失败后DbContext的实体跟踪状态没有重置,重试时可能出现状态残留问题,建议每次重试都重新创建DbContext实例,或重试前清理实体跟踪状态。

问题4:大小写拼写错误(潜在编译问题)

C#大小写敏感,你代码中shouldRetryon方法名应为基类定义的ShouldRetryOn,否则相当于未重写基类方法,会走默认重试逻辑;另外ExecutionstrategyDependencies、Timespan等类型拼写的大小写也需修正,避免编译报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:15:03