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
相关产品推荐
相关产品推荐

