SQL连接字符串Min pool size验证方法及连接数异常问题咨询
一、验证Min Pool Size是否生效的方法
通过系统视图查询连接数
使用sys.dm_exec_connections和sys.dm_exec_sessions视图筛选目标登录名的连接,观察应用启动后的初始连接数:SELECT c.session_id, s.login_name, c.connect_time, s.status FROM sys.dm_exec_connections c JOIN sys.dm_exec_sessions s ON c.session_id = s.session_id WHERE s.login_name = '你的目标登录名'应用启动后,即使没有任何业务请求,池中至少会存在
Min Pool Size指定数量的连接(状态通常为sleeping)。跟踪连接池的登录/退出事件
用SQL Server的Extended Events或Profiler跟踪Audit Login和Audit Logout事件:- 启动应用后,会一次性创建
Min Pool Size数量的Audit Login事件,这些连接不会触发Audit Logout,直到应用进程退出或连接池被清空; - 业务请求增加时连接数会超过Min值,空闲后会回落至Min值(不会低于这个数)。
- 启动应用后,会一次性创建
使用性能计数器监控
在Windows性能监视器中,找到.NET Data Provider for SQL Server下的Number of Pooled Connections计数器,绑定到你的应用进程:- 应用启动后,计数器值会稳定在
Min Pool Size左右; - 调用
SqlConnection.ClearAllPools()清空连接池后,计数器会重新回到Min Pool Size的值,可直接证明参数生效。
- 应用启动后,计数器值会稳定在
二、设置Min Pool Size=7但终止后剩6个连接的原因
应用进程未彻底终止
手动终止用户进程后,可能存在残留的子进程、后台线程或应用池(比如IIS的工作进程)未完全退出,这些进程仍持有连接池,池中的连接不会被释放。比如ASP.NET应用如果没回收应用池,连接池会持续存在。连接池闲置连接的回收延迟
连接池中的闲置连接默认会保留300秒(5分钟),超过这个时间才会被自动销毁。你刚终止进程就查看,这些连接还处于闲置状态,尚未被清理,所以显示6个。等待几分钟后再查询,连接数应该会降到0。连接池内部验证连接的占用
部分数据访问框架的连接池会保留一个连接用于定期验证数据库可用性,这个连接不会被计入常规业务连接数,可能导致显示的连接数比设置的Min值少1。不过这种情况在进程完全终止后应该会消失,所以更可能是前两种原因。
内容的提问来源于stack exchange,提问作者mario

