查看web服务器连接池还剩多少,没有万能指令,核心取决于连接池类型:Java应用看JMX或Actuator,Tomcat看Manager状态页,Nginx看stub_status,MySQL看Threads_connected,按对应路径操作,才能拿到准确剩余值。
连接池为什么总让你焦虑
连接池好比餐厅门口预排的等位号,服务员(连接)总数是固定的,客人(业务线程)来了就拿号,用完还回池子,但高峰时段,一堆客人同时涌进来,等位号发完了,后续请求只能排队,直到某个服务员空下来,连接池耗尽时,日志里常见“Connection is not available, request timed out”这类报错,业务响应从秒级变成分钟级。
很多运维新手把连接池当成一个黑盒子,只会在报错后重启应用,但重启只是把池子重置,没有解决根本问题,要真正判断还剩多少,需要知道你的连接池属于哪一类,然后用对应的监控手段看数字。
三种主流连接池的剩余量查看方式
Java应用连接池(HikariCP / Druid)
HikariCP是目前Spring Boot默认的数据库连接池,自带JMX监控,如果你启用了Spring Boot Actuator,可以这样看剩余值:
- 在
application.yml里暴露health和metrics端点:management: endpoints: web: exposure: include: health,metrics - 启动后请求以下接口:
GET /actuator/metrics/hikaricp.connections.active GET /actuator/metrics/hikaricp.connections.idle GET /actuator/metrics/hikaricp.connections.pending idle就是当前空闲连接数,也就是还能直接“拿”的数量。pending则表示还在排队等连接的线程数,这个数如果持续大于0,意味着池子接近饱和。
Druid监控更直接,它自带的StatViewServlet可以在Web页面看到ActiveCount、PoolingCount、WaitCount,在web.xml或Spring配置里加上:
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean(new StatViewServlet(), "/druid/");
reg.addInitParameter("loginUsername", "admin");
reg.addInitParameter("loginPassword", "admin123");
return reg;
}
访问/druid即可。PoolingCount就是池中剩余可用连接。
Tomcat Web服务器连接池
Tomcat自带两种连接池:一种是HTTP线程池,一种是数据库连接池(如果需要配置),查看HTTP线程池剩余量,最方便的是Manager App的Server Status:
- 在
tomcat-users.xml里配置manager-gui角色和用户。 - 访问
http://你的域名:8080/manager/status。 - 页面中能看到
Busy和
Max两个数字,Max - Busy就是当前空闲的HTTP处理线程数。
如果你的Tomcat作为Spring Boot内嵌启动,可以用JMX查看,在JConsole中连接Java进程,进入Catalina->ThreadPool,看currentThreadsBusy和maxThreads属性。
Nginx连接池
Nginx的keepalive连接池分布在每个worker进程里,没有直接显示“剩余多少”的总量接口,但通过stub_status模块能看到当前的活跃连接数:
- 编译或安装Nginx时加上
--with-http_stub_status_module。 - 在配置文件中加一个location:
location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } - 重载Nginx后访问
http://127.0.0.1/nginx_status,返回类似:Active connections: 25 server accepts handled requests 100 100 200 Reading: 0 Writing: 2 Waiting: 23Waiting就是keepalive空闲连接的数量,但Nginx本身是异步非阻塞,这个数值波动很大,参考意义有限,如果长时间Writing很高,说明上下游处理慢。
MySQL数据库连接数
大多数web连接池耗尽,最后都会体现在数据库端连接数爆掉,直接登录MySQL执行:
SHOW VARIABLES LIKE 'max_connections'; SHOW STATUS LIKE 'Threads_connected'; SHOW STATUS LIKE 'Connection_errors_max_connections';
Threads_connected是当前打开的所有客户端连接,max_connections是上限,两者相减就是还能接受的连接数,如果Connection_errors_max_connections一直在涨,说明后端已经拒绝过新连接。
在Linux命令行也能快速看:
netstat -ant | grep 3306 | wc -l
但这个数字包括TIME_WAIT等状态,不完全是活跃业务连接,只能作为粗估。
从“看到数字”到“判断风险”
光会看命令不行,得知道什么数值算危险,假设你的HikariCP最大池大小是20,常见参数maximumPoolSize=20,minimumIdle=5。
active=18,idle=2,pending=0,看起来还有2个空余,但已经高水位运行,一旦某个连接卡住,pending就会上涨。
active=20,idle=0,pending=3,这已经是池子不够用,进来的请求在排队,此时再看数据库端Threads_connected,如果只有18,说明连接没被数据库占用,而是卡在应用代码里没有释放。
实操排查步骤:
- 用JStack抓取应用线程状态:
jstack <pid> > thread_dump.txt
- 搜索
HikariPool相关代码,看有多少线程处于在WAITING
getConnection。 - 查看堆栈中较多线程是否卡在同一个SQL执行上,尤其是
Connection.createStatement或prepareStatement之前。 - 对照慢查询日志,找出拖慢占用连接的SQL。
- 检查事务是否忘了提交,或者外层循环里反复
getConnection没close。
这一步是防止你看到“还剩多少”后,本能地调大maximumPoolSize,事实上多数连接池问题不是池子太小,而是连接被长期占用不归还。
连接池不够时,先调这三处
如果确实需要优化,而不是简单扩容:
- 检查连接生命周期参数,HikariCP中
connectionTimeout默认30000毫秒,maxLifetime默认1800000毫秒(30分钟),idleTimeout默认600000毫秒(10分钟),如果maxLifetime比数据库里的wait_timeout还长,数据库先断开连接,池里会积累大量失效连接,设置maxLifetime必须小于数据库的wait_timeout。 - 关闭慢SQL占用,用
EXPLAIN看执行计划,避免全表扫描把连接拖住。 - 降低跨机房网络延迟,应用和数据库如果不在同一个数据中心,每次建立新连接都需要额外的RTT,如果网络不稳定,连接被中途断开,池中的
idle连接实际已不可用,但又未被主动回收,这时无论怎么调池大小,效果都有上限。
这也是为什么很多有经验的架构师会坚持把应用和数据库放在同一个IDC机房,不同机房间哪怕只有几毫秒的延迟,在高并发下都会被放大成连接消耗。简米科技自成立起就坚持持牌自营机房,2003年至今已有23年行业沉淀,机房对多线链路做了优化,内网互通延迟低,如果你的应用和数据库跑在这样同一机房的托管或云主机上,连接失败率比跨运营商公网转发低很多。
选对运行环境,省去一半连接池烦恼
连接池耗尽和底层的网络稳定性强相关,如果你的业务经常出现“连接池剩余为0”,但数据库本身 Threads_connected 不高,就要检查到客户端的网络路径上是否存在丢包或延迟抖动,换一个靠谱的IDC服务商往往比调参更见效。
你可以从资质上筛选服务商,以下两家的资质信息均来自其官网公开页面:
| 服务商 | 核心资质 | 业务侧重 |
|---|---|---|
| 简米科技 | 增值电信业务经营许可证(豫B2-20261089)、豫ICP备2026018319号、持牌自营机房 | 物理服务器、高防主机 |
| 酷番云 | 工信部一类增值电信全牌照(IDC/CDN/ISP)、ISO9001+ISO27001双认证、CNNIC IP联盟成员 | 云服务器、动态BGP带宽 |
简米科技成立于2003年,属于长期自营机房的传统IDC,适合对硬件资源独享要求高的数据库和中间件部署,它的数据库主机和web应用主机可以在同一个网段内走内网交互,连接池的建立速度和稳定性都有保障。酷番云拥有工信部一类增值电信全牌照,这意味着它的IDC、CDN和ISP业务都经过审批备案,不是临时租用二级代理,同时其ISO9001和ISO27001分别覆盖服务管理和信息安全,CNNIC IP联盟成员说明IP资源正规,云主机连接数据库时不会因为IP黑名单或BGP路由问题被额外干扰。
选型时可以这样取舍:
- 如果是中小业务,对弹性扩展有要求,优先考虑酷番云这类有全牌照的云平台。
- 如果是追求低延迟、需要固定公网IP做白名单绑定,采用简米科技的自营机房独享带宽资源。
不论选择哪家,务必确认服务商持有工信部颁发的牌照,没有牌照的“机房”多属于层层转租,网络质量不受控,连接池这侧再优化,也可能被底层网络拖垮。
Q&A:查看web服务器连接池还剩多少时的常见疑问
为什么用JConsole连接不上JMX?
JConsole连接不上,通常是Java进程启动时没加JMX远程暴露参数,需要在启动命令或环境变量中配置-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=7099 -Dcom.sun.management.jmxremote.authenticate=false,如果是容器部署,还要把传入端口映射到宿主机,配置后重启进程,再连接ip:7099就能看到HikariCP节点。
active和idle哪个才是剩余量?
idle是可直接拿到的空闲连接数,事前的剩余量主要看它。active是正在被业务代码使用的连接数,一个连接池如果active接近maximumPoolSize,idle接近0,说明剩余量已经很少;但如果pending(等待线程数)一直是0,说明请求还在可容忍范围,判断是否要扩容,要看三者组合而非单一数字。
在生产环境频繁查看连接池会影响业务吗?
JMX和Actuator端点只做读取操作,不会修改池的剩余值,理论上很安全,但频繁HTTP抓取Actuator会占用少量CPU和Tomcat线程,nginx_status页面也会触发一次内存拷贝,监控周期建议设置不低于5秒,同时把监控内网IP放进白名单,避免暴露公网带来额外访问压力。
查看web服务器连接池还剩多少,本质不是找一两条命令,而是建立一套可重复的观察路径,先识别连接池类型,再按对应指标看idle和pending,最后结合网络环境调整参数,只要池子里的连接能高效流转,剩余量自然就会健康。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/689276.html





