druid连接池需协同配置参数并启用statfilter才能实现mysql连接保活与sql监控:通过test-while-idle、time-between-eviction-runs-millis等参数组合实现空闲连接验证,配合validationquery=select 1;必须显式启用stat filter并配置slow-sql-millis阈值才能记录慢sql,同时需暴露/druid监控端点查看实时指标。

Druid 连接池对 MySQL 的连接保活和 SQL 监控不是“开个开关”就能生效的,关键在于参数协同与 Filter 启用。配置得当,能显著减少因网络闪断、数据库重启或防火墙超时导致的 CommunicationsException,同时让慢 SQL 无处遁形。
MySQL 连接保活:防止空闲连接被中间设备或数据库主动断开
MySQL 默认 wait_timeout 通常为 28800 秒(8 小时),但实际环境中,负载均衡器、云厂商 SLB 或 NAT 网关常设更短的空闲超时(如 5–15 分钟)。若连接池不主动探测,归还后长期闲置的连接就会在下次取出时失效。
Druid 不靠简单心跳包,而是通过“空闲检测 + 主动验证”组合实现保活:
-
启用空闲连接验证:设置
test-while-idle: true(YAML)或setTestWhileIdle(true)(代码),让 Druid 在连接空闲期间执行有效性检查 -
控制检测节奏:配合
time-between-eviction-runs-millis: 60000(每分钟扫描一次空闲连接) -
设定最小空闲存活时间:
min-evictable-idle-time-millis: 300000(5 分钟),避免刚创建就回收;同时确保它 小于 MySQL 的wait_timeout(建议设为后者的 70%) -
指定验证 SQL:MySQL 推荐用
validationQuery: SELECT 1,轻量且兼容高版本(无需权限)
SQL 执行监控:实时捕获耗时、慢查与执行频次
SQL 监控依赖 StatFilter —— 它是 Druid 内置的统计过滤器,必须显式启用才能采集指标。
Spring Boot 中(application.yml)配置示例:
spring:
datasource:
druid:
filter:
stat:
enabled: true
db-type: mysql
log-slow-sql: true
slow-sql-millis: 1000 # 超过 1 秒记为慢 SQL
非 Spring Boot 项目(如 MyBatis 原生集成),需在 druid.properties 或 mybatis-config.xml 中声明:
<property name="filters" value="stat,wall"></property>
注意:stat 必须在 filters 列表中,否则监控数据不会上报。
配套监控页面:把数据“看”得见
仅开启 StatFilter 只是采集数据,要可视化还需暴露 Web 监控端点:
- 启用
StatViewServlet:提供连接池状态、SQL 列表、URI 关联等页面 - 配置访问路径与权限(生产环境务必修改默认账号密码):
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: your_strong_password
reset-enable: false
allow: 192.168.10.0/24 # 白名单 IP 段
启动后访问 http://your-app:port/druid 即可查看活跃连接数、SQL 执行 TOP、慢 SQL 日志、数据源健康状态等。
关键协同点:保活与监控不是孤立配置
很多问题出在参数“打架”:
- 如果
min-evictable-idle-time-millis设为 600000(10 分钟),但 MySQL 的wait_timeout=60(1 分钟),那空闲连接永远等不到被检测就已被 MySQL 强制关闭 → 应设为 30000–45000(30–45 秒)更稳妥 -
log-slow-sql: true必须配合slow-sql-millis才生效;若只开日志不设阈值,所有 SQL 都会记为慢查 - 监控页面看到的“SQL 执行次数”可能远高于业务调用次数——这是由于 MyBatis 的
<foreach></foreach>、批量插入等会生成多条语句,属正常现象
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











