生产环境突发SQL Server连接池耗尽引发会话数据库连接异常排查
生产环境SQL Server连接池超时异常排查记录
生产异常表现
生产环境稳定运行期间,日志突然捕获多层级异常堆栈,核心异常类型包括:
System.Web.HttpException (0x80004005):触发类型为System.Web.HttpException的异常- 关联业务异常:
System.Web.HttpException (0x80004005):无法连接到SQL Server会话数据库 - 底层核心异常:
System.InvalidOperationException:从连接池获取连接时超时,通常由池内所有连接被占用、达到最大连接池阈值引发
排查初始认知与方向
排查初期参考同类问题的通用解法,首先判定常规数据库调用代码不存在连接泄漏问题,拒绝仅通过将最大连接池阈值上调至200的临时方式规避问题,目标定位突发异常的根本诱因。
当前生产环境的数据库连接字符串分两类配置,两类均启用MultipleActiveResultSets=True参数:
- NHibernate 框架对应的数据库连接配置
- Entity Framework 框架对应的数据库连接配置
初步校验的无泄漏场景
排查初期首先对照数据库调用的规范写法,确认以下场景的代码不存在连接泄漏问题:
- 所有通过
using语句包裹DbContext实例、数据库连接对象的代码 - 手动打开连接后通过DataReader读取多组结果集、操作完成后显式关闭连接的代码
最终定位的根因
经全链路代码走查,最终确认Entity Framework调用链路存在隐蔽的连接泄漏问题,具体问题点:
- 部分业务代码未使用
using语句管理DbContext生命周期,典型问题写法是将DbContext定义为类级别的私有实例直接开展查询操作,未及时释放对应的数据库连接资源 - 这类未做资源释放的查询逻辑,单次执行就会触发超过100次数据库调用,会在短时间内快速耗尽连接池容量,最终引发连接获取超时异常
内容的提问来源于stack exchange,提问作者Ben.S
相关产品推荐
相关产品推荐

