LinqToDB DataConnection退出using块未释放引发数据库连接泄漏
.NET HostedService中LinqToDB数据库连接泄漏问题
问题现象
按规范编写的资源释放逻辑未生效,始终存在连接泄漏问题:using块按设计本应自动完成资源释放,但数据库端连接始终无法正常关闭。
具体异常表现:
- 数据库侧观测到连接持续保持打开状态
- 运行过程中不断新建连接,完全没有连接池复用的表现
- 已验证Dispose执行逻辑:连接类实例被释放后,调用相关方法会正常抛出
ObjectDisposedException,说明Dispose方法本身确实被触发执行
问题相关代码
问题出在HostedService的StartAsync启动初始化逻辑中,代码如下:
public async Task StartAsync(CancellationToken cancellationToken) { using (var scope = _serviceProvider.CreateScope()) { _logger.LogDebug($"Инициализация операторов"); using (var operatorRepo = scope.ServiceProvider.GetService<IOperatorRepository>()) { var availableOperators = operatorRepo.GetAllOperatorsWithSkills(); _logger.LogDebug($"Инициализовано {availableOperators.Count()} операторов"); foreach (OperatorRow opRow in availableOperators) { OperatorMeta opMeta = new(opRow.Idr, opRow.Name, opRow.Number, opRow.OperatorSkills.Select(skill => (skill.SkillId, skill.Experience))); if (!TryAddOperator(opMeta)) throw new ArgumentException($"Оператор с id {opRow.Idr} уже был добавлен!"); } if (Convert.ToBoolean(_configuration.GetSection("isOperatorTesting")?.Value)) { _globalOperatorPool.TryAdd( -1, new CampaignOperator( new OperatorMeta(-1, "Test operator", _configuration.GetSection("testOperatorNumber").Value, Enumerable.Empty<(int, int)>()), OperatorState.Unassigned) ); } } } }
已尝试操作与已知上下文
- 曾在
using块内部额外增加try-finally块包裹业务逻辑做资源释放兜底,未解决问题 IOperatorRepository的底层实现经过两层类继承,最终派生自LinqToDB.DataConnection,整个继承链中只有这个最终基类实现了IDisposable接口- 目前无明确排查方向,寻求问题定位思路
内容的提问来源于stack exchange,提问作者Johnny Cache
相关产品推荐
相关产品推荐

