Druid 连接池配置与调优实战指南【免费下载链接】druid阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品为监控而生的数据库连接池项目地址: https://gitcode.com/gh_mirrors/druid/druid生产环境的 Java 服务使用 Druid 连接池某日监控突然告警GetConnectionTimeoutException刷屏WaitThreadCount持续爬升ActiveCount打满maxActive只能重启服务解围。根因大多是容量、等待与空闲回收三类参数没调过。结论先行先设好maxWait与minEvictableIdleTimeMillis再按实际负载调maxActive与minIdle最后用监控页确认。原理速览连接池像一家餐厅Druid 管理的是数据库物理连接一条连接建立成本不低所以要复用。用餐厅类比maxActive是餐厅总桌数initialSize是开业时摆好的桌数minIdle是始终留好的空桌高峰来了免翻台maxWait是客人排队的最长耐心后台线程则负责定时清桌、换掉坏桌。记住两个角色一个创建线程负责在空闲时把连接数补到minIdle以上一个回收线程每隔固定周期做一次清理包括检测空闲连接、回收超期连接、回收泄漏连接。后文所有参数都围绕这两个角色展开。冷启动提速让应用先起来连接慢慢补本节解决应用启动慢、多实例同时发布时把数据库连接数占满的问题。原理一句话asyncInit开启后initialSize个连接交给后台线程创建init()立即返回不再阻塞发布流程。参数默认值含义推荐值asyncInitfalse启动时是否同步建连接trueinitialSize0启动时创建的物理连接数01minIdle0后台维持的最小空闲连接数520# application.properties spring.datasource.druid.async-inittrue # 启动不阻塞连接后台补 spring.datasource.druid.initial-size1 # 只建 1 条启动最快 spring.datasource.druid.min-idle10 # 后台慢慢补到 10踩坑提示多实例服务发布时若initialSize偏大几十个实例会同时创建连接瞬间打满数据库max_connections应用自己起不来。initialSize建议取 01把水位交给minIdle在运行期补齐。扛住并发maxActive 和 maxWait 怎么定本节解决高峰期请求排队、线程大面积阻塞的问题。原理一句话容量maxActive决定峰值能扛多少等待maxWait决定扛不住时多快失败。参数默认值含义推荐值maxActive8最大连接数20100按单实例并发量maxWait-1无限等待借不到连接的最大等待时间毫秒30005000minIdle0空闲时保留的最低连接数1020取业务低谷并发量spring.datasource.druid.max-active50 # 按单实例峰值并发估算 spring.datasource.druid.max-wait5000 # 等待 5 秒就报错不无限挂 spring.datasource.druid.min-idle20 # 低谷也留 20 条突发流量免建连约束条件见 DruidDataSource.java连接池核心实现init()中的参数校验就在这里maxActive不能为 0且必须不小于minIdle违反直接抛IllegalArgumentException。踩坑提示maxActive常按CPU 核数 ×2 1拍脑袋。正确做法是看单实例峰值并发数据库侧满足max_connections≥ 全部实例maxActive之和留 20% 余量应用侧用压测确认WaitThreadCount峰值接近 0。长期不泄漏别让死连接和漏掉的连接坑你本节解决运行几天后偶发连接报错、内存缓慢上涨的问题。原理一句话后台回收线程定期清掉坏连接、超期连接和忘记归还的连接。参数默认值含义推荐值testWhileIdletrue空闲连接被借出前是否检测有效性true保持默认timeBetweenEvictionRunsMillis60000回收线程工作周期毫秒3000060000minEvictableIdleTimeMillis180000030 分钟空闲超过多久可被回收毫秒3000005 分钟keepAlivefalse对空闲连接发送心跳保活trueMySQL 环境keepAliveBetweenTimeMillis120000保活心跳间隔毫秒120000保持默认removeAbandonedfalse强制回收借出超时的连接排查泄漏时 true平时 falseremoveAbandonedTimeout3000005 分钟借出多久算废弃毫秒最长查询耗时的 2 倍以上spring.datasource.druid.test-while-idletrue # 借出前验活保持默认 spring.datasource.druid.min-evictable-idle-time-millis300000 spring.datasource.druid.keep-alivetrue # 空闲连接发心跳防被数据库断开 spring.datasource.druid.remove-abandonedtrue # 仅排查泄漏时临时开启 spring.datasource.druid.log-abandonedtrue # 打印泄漏连接的创建堆栈回收与保活的执行逻辑集中在 DruidDataSource.java 的DestroyTask/keepAliveTask默认值速查见仓库自带的 doc/connection-pool-guide.md。踩坑提示removeAbandoned是双刃剑——它会连跑得慢的长事务一起杀。生产长开前先确认业务最长 SQL 耗时把removeAbandonedTimeout设到它的 2 倍以上排查完记得关闭否则误杀比泄漏更伤。验证与度量怎么确认参数真的生效本节解决改完不知道有没有用的问题。最直接的方式是看 Druid 内置监控页StatFilter采集、stat-view-servlet暴露spring.datasource.druid.filtersstat spring.datasource.druid.stat-view-servlet.url-pattern/druid/*打开http://主机:端口/druid/index.html的数据源页对照预期值指标预期ActiveCount≤maxActive峰值后回落平稳WaitThreadCount压测峰值后回到 0PhysicalConnectCount运行 1 小时基本不增长无频繁建连removeAbandonedCount恒为 0无泄漏被回收没有 Web 监控时可用 JMX 读 MBeanjcmd或 JConsole 均可jcmd pid JmxRuntime.operation com.alibaba.druid:typeDruidDataSource,id主数据源 getActiveCount jcmd pid JmxRuntime.operation com.alibaba.druid:typeDruidDataSource,id主数据源 getWaitThreadCountid取数据源的实际名称。监控指标含义清单见 doc/monitoring-guide.md。问题排查三个高频故障的排查顺序本节把三类最常见的线上故障整理成可照做的检查清单。故障一GetConnectionTimeoutException刷屏ActiveCount 打满、WaitThreadCount 持续 0Step 1打开监控页慢 SQL标签找执行耗时最长的 SQL确认是否缺索引或被锁等待拖住连接是则先优化 SQL。Step 2看removeAbandonedCount是否增长增长说明有代码借出后未 close临时开removeAbandonedtruelogAbandonedtrue读日志里的创建堆栈定位代码行。Step 3确认连接都正常归还后再谈扩容maxActive上调 50%并核对数据库max_connections是否够用。故障二跑几小时后随机报Communications link failure重启即好Step 1SHOW VARIABLES LIKE wait_timeout查数据库超时值MySQL 默认 28800 秒确认minEvictableIdleTimeMillis是否小于它建议 3000005 分钟以内。Step 2确认testWhileIdletrue未被覆盖若中间还有防火墙/NAT 会掐断空闲 TCP追加keepAlivetruekeepAliveBetweenTimeMillis120000。Step 3观察一天PhysicalConnectCount增长应平稳若仍在跳说明仍有连接生命周期长于保活周期继续下调minEvictableIdleTimeMillis。故障三开了removeAbandoned后长任务被误杀日志出现remove_abandonedStep 1把removeAbandonedTimeout调到最长查询耗时的 2 倍以上例如最长查询 120 秒则至少设 600000 毫秒。Step 2用logAbandoned打印的堆栈判断性质堆栈对应的 SQL 确实跑了很久是慢代码里没有 close 才是漏分别走调参或修代码。Step 3稳定后关闭removeAbandoned只保留testWhileIdle体系做兜底。场景速查与进阶入口场景推荐配置多实例滚动发布、启动提速asyncInittrue、initialSize1、minIdle10高峰保水位、等待快速失败maxActive50、minIdle20、maxWait5000MySQL 长期运行防断连testWhileIdletrue、minEvictableIdleTimeMillis300000、keepAlivetrue排查连接泄漏removeAbandonedtrue、removeAbandonedTimeout≥最长查询×2、logAbandonedtrue先定等待与回收周期再按负载调容量改完看WaitThreadCount与ActiveCount验证比反复重启有效得多。进阶阅读doc/connection-pool-guide.md全参数速查、doc/monitoring-guide.md监控指标详解、core/src/main/java/com/alibaba/druid/pool/DruidDataSource.java连接池核心源码。【免费下载链接】druid阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品为监控而生的数据库连接池项目地址: https://gitcode.com/gh_mirrors/druid/druid创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考