1. Druid 德鲁伊数据库连接池的瑞士军刀第一次接触 Druid 是在三年前的一个电商项目中当时系统频繁出现数据库连接泄漏每天半夜都要手动重启服务。直到团队里的架构师推荐了这款阿里开源的数据库连接池我才真正体会到什么叫一劳永逸。Druid 不仅仅是个连接池更像是个自带诊断工具的数据库管家。Druid 的核心价值在于它的双重身份既是高性能的连接池又是功能完备的监控平台。相比传统的 HikariCP 或 Tomcat JDBC Pool它提供了开箱即用的 SQL 监控、防火墙、URI 分析等功能。特别是在 Spring Boot 生态中通过简单的 starter 依赖就能获得这些能力这对中小团队来说简直是福音。记得有次排查线上慢查询通过 Druid 的监控界面直接定位到某个分页查询缺少索引整个过程只用了 5 分钟。这种即时反馈的调试体验是很多商业监控工具都难以企及的。下面我就带大家从零开始在 Spring Boot 项目中搭建这套监控体系。2. 环境准备搭建 Spring Boot 基础框架2.1 项目初始化建议使用 Spring Initializr 创建项目骨架我习惯用以下配置打包方式Maven语言Java 8依赖Web、JPA或 MyBatis、MySQL Drivercurl https://start.spring.io/starter.zip \ -d typemaven-project \ -d languagejava \ -d bootVersion2.7.0 \ -d groupIdcom.example \ -d artifactIddruid-demo \ -d dependenciesweb,data-jpa,mysql \ -o druid-demo.zip2.2 数据库准备MySQL 5.7 是最佳选择这里有个小技巧在本地用 Docker 快速启动测试库docker run --name mysql57 \ -e MYSQL_ROOT_PASSWORD123456 \ -p 3306:3306 \ -d mysql:5.7 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci创建测试数据库时建议开启 general log 方便调试CREATE DATABASE demo CHARACTER SET utf8mb4; SET GLOBAL general_log ON; SET GLOBAL log_output TABLE;3. Druid 集成实战3.1 Maven 依赖配置在 pom.xml 中添加以下依赖注意版本号差异dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.16/version /dependency版本选择建议Spring Boot 2.x 用 1.2.x 系列Spring Boot 3.x 需要等正式适配版3.2 配置文件深度解析application.yml 的配置大有讲究这是我优化过的生产级配置spring: datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/demo?useSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver druid: # 连接池核心配置 initial-size: 5 min-idle: 5 max-active: 50 max-wait: 60000 # 连接有效性检测 validation-query: SELECT 1 test-while-idle: true test-on-borrow: false test-on-return: false # 监控专用配置 filters: stat,wall,slf4j stat-view-servlet: enabled: true url-pattern: /druid/* reset-enable: false login-username: admin login-password: admin123 web-stat-filter: enabled: true url-pattern: /* exclusions: *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* # 生产环境必须配置 filter: stat: slow-sql-millis: 1000 log-slow-sql: true wall: config: multi-statement-allow: true关键参数说明max-active根据服务器 CPU 核数 × 2 有效磁盘数计算test-while-idle生产环境必须开启避免拿到失效连接filtersstat 用于监控wall 防 SQL 注入slf4j 输出日志slow-sql-millis建议设置为平均查询时间的 3 倍3.3 监控面板激活启动应用后访问http://localhost:8080/druid你会看到这样的登录界面输入配置的用户名密码后就能看到完整的监控仪表盘。第一次使用时建议重点观察这几个标签页数据源连接池实时状态SQL 监控所有执行的 SQL 统计SQL 防火墙拦截的恶意请求Web 应用URI 访问统计4. 监控平台实战技巧4.1 慢 SQL 优化实战在电商项目中我们曾通过 Druid 发现一个商品列表查询平均耗时 2.8 秒。监控面板清晰地显示执行次数最慢(ms)平均(ms)SQL 片段1,2584,3122,812SELECT * FROM product WHERE category_id?通过 EXPLAIN 分析发现缺少 category_id 索引添加后性能提升 20 倍ALTER TABLE product ADD INDEX idx_category (category_id);4.2 连接泄漏排查某次上线后出现连接数持续增长通过 Druid 的「连接持有时间分布」发现大量连接持有超过 1 小时最终定位到是 MyBatis 的 ResultHandler 没有正确关闭。这种问题用传统日志很难发现但 Druid 的监控曲线一目了然。4.3 多数据源配置对于需要连接多个数据库的项目可以这样配置Configuration public class DruidConfig { Bean ConfigurationProperties(spring.datasource.druid.master) public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } Bean ConfigurationProperties(spring.datasource.druid.slave) public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } }对应的 yml 配置spring: datasource: druid: master: url: jdbc:mysql://master-host:3306/db username: master_user password: master_pass slave: url: jdbc:mysql://slave-host:3306/db username: slave_user password: slave_pass5. 生产环境注意事项5.1 安全加固修改默认密码一定要改掉 admin/123456 这种弱密码配置 IP 白名单stat-view-servlet: allow: 192.168.1.100,127.0.0.1禁用 Reset All避免误操作清空统计数据reset-enable: false5.2 性能调优连接数公式maxActive (核心数 * 2) 有效磁盘数超时设置maxWait应该略大于平均事务时间监控开销filters: stat会有 5% 性能损耗高并发场景可改用filters: mergeStat5.3 常见问题排查问题一监控页面无法访问检查url-pattern是否被 Security 拦截确认stat-view-servlet.enabledtrue问题二没有 SQL 监控数据检查filters是否包含stat确认使用的是 DruidDataSource问题三连接数不释放检查test-while-idle和validation-query用jstack检查连接持有线程6. 进阶功能探索6.1 与 Prometheus 集成通过简单配置暴露 Druid 监控指标dependency groupIdio.github.mweirauch/groupId artifactIdmicrometer-jvm-extras/artifactId version0.2.2/version /dependencyBean public DruidStatMetrics druidStatMetrics(){ return new DruidStatMetrics(); }6.2 动态配置刷新结合 Nacos 实现运行时参数调整RefreshScope Bean public DataSource dataSource( Value(${spring.datasource.url}) String url, // 其他参数... ) { return DruidDataSourceBuilder.create().build(); }6.3 定制监控页面克隆官方前端项目进行二次开发git clone https://github.com/alibaba/druid.git cd druid/src/main/resources/support/http/resources修改后重新打包资源文件即可替换默认界面。经过多个项目的实战验证Druid 已经成为我技术栈中不可或缺的组件。它就像数据库领域的听诊器让隐藏的性能问题无所遁形。特别是在微服务架构下每个服务配一个独立的监控面板比集中式监控系统更轻量灵活。如果你还没尝试过 Druid 的监控功能现在正是最佳时机。
Druid 德鲁伊 | 从零到一:Spring Boot 项目集成与监控平台实战
发布时间:2026/5/24 0:05:08
1. Druid 德鲁伊数据库连接池的瑞士军刀第一次接触 Druid 是在三年前的一个电商项目中当时系统频繁出现数据库连接泄漏每天半夜都要手动重启服务。直到团队里的架构师推荐了这款阿里开源的数据库连接池我才真正体会到什么叫一劳永逸。Druid 不仅仅是个连接池更像是个自带诊断工具的数据库管家。Druid 的核心价值在于它的双重身份既是高性能的连接池又是功能完备的监控平台。相比传统的 HikariCP 或 Tomcat JDBC Pool它提供了开箱即用的 SQL 监控、防火墙、URI 分析等功能。特别是在 Spring Boot 生态中通过简单的 starter 依赖就能获得这些能力这对中小团队来说简直是福音。记得有次排查线上慢查询通过 Druid 的监控界面直接定位到某个分页查询缺少索引整个过程只用了 5 分钟。这种即时反馈的调试体验是很多商业监控工具都难以企及的。下面我就带大家从零开始在 Spring Boot 项目中搭建这套监控体系。2. 环境准备搭建 Spring Boot 基础框架2.1 项目初始化建议使用 Spring Initializr 创建项目骨架我习惯用以下配置打包方式Maven语言Java 8依赖Web、JPA或 MyBatis、MySQL Drivercurl https://start.spring.io/starter.zip \ -d typemaven-project \ -d languagejava \ -d bootVersion2.7.0 \ -d groupIdcom.example \ -d artifactIddruid-demo \ -d dependenciesweb,data-jpa,mysql \ -o druid-demo.zip2.2 数据库准备MySQL 5.7 是最佳选择这里有个小技巧在本地用 Docker 快速启动测试库docker run --name mysql57 \ -e MYSQL_ROOT_PASSWORD123456 \ -p 3306:3306 \ -d mysql:5.7 \ --character-set-serverutf8mb4 \ --collation-serverutf8mb4_unicode_ci创建测试数据库时建议开启 general log 方便调试CREATE DATABASE demo CHARACTER SET utf8mb4; SET GLOBAL general_log ON; SET GLOBAL log_output TABLE;3. Druid 集成实战3.1 Maven 依赖配置在 pom.xml 中添加以下依赖注意版本号差异dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version1.2.16/version /dependency版本选择建议Spring Boot 2.x 用 1.2.x 系列Spring Boot 3.x 需要等正式适配版3.2 配置文件深度解析application.yml 的配置大有讲究这是我优化过的生产级配置spring: datasource: type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://localhost:3306/demo?useSSLfalse username: root password: 123456 driver-class-name: com.mysql.cj.jdbc.Driver druid: # 连接池核心配置 initial-size: 5 min-idle: 5 max-active: 50 max-wait: 60000 # 连接有效性检测 validation-query: SELECT 1 test-while-idle: true test-on-borrow: false test-on-return: false # 监控专用配置 filters: stat,wall,slf4j stat-view-servlet: enabled: true url-pattern: /druid/* reset-enable: false login-username: admin login-password: admin123 web-stat-filter: enabled: true url-pattern: /* exclusions: *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* # 生产环境必须配置 filter: stat: slow-sql-millis: 1000 log-slow-sql: true wall: config: multi-statement-allow: true关键参数说明max-active根据服务器 CPU 核数 × 2 有效磁盘数计算test-while-idle生产环境必须开启避免拿到失效连接filtersstat 用于监控wall 防 SQL 注入slf4j 输出日志slow-sql-millis建议设置为平均查询时间的 3 倍3.3 监控面板激活启动应用后访问http://localhost:8080/druid你会看到这样的登录界面输入配置的用户名密码后就能看到完整的监控仪表盘。第一次使用时建议重点观察这几个标签页数据源连接池实时状态SQL 监控所有执行的 SQL 统计SQL 防火墙拦截的恶意请求Web 应用URI 访问统计4. 监控平台实战技巧4.1 慢 SQL 优化实战在电商项目中我们曾通过 Druid 发现一个商品列表查询平均耗时 2.8 秒。监控面板清晰地显示执行次数最慢(ms)平均(ms)SQL 片段1,2584,3122,812SELECT * FROM product WHERE category_id?通过 EXPLAIN 分析发现缺少 category_id 索引添加后性能提升 20 倍ALTER TABLE product ADD INDEX idx_category (category_id);4.2 连接泄漏排查某次上线后出现连接数持续增长通过 Druid 的「连接持有时间分布」发现大量连接持有超过 1 小时最终定位到是 MyBatis 的 ResultHandler 没有正确关闭。这种问题用传统日志很难发现但 Druid 的监控曲线一目了然。4.3 多数据源配置对于需要连接多个数据库的项目可以这样配置Configuration public class DruidConfig { Bean ConfigurationProperties(spring.datasource.druid.master) public DataSource masterDataSource() { return DruidDataSourceBuilder.create().build(); } Bean ConfigurationProperties(spring.datasource.druid.slave) public DataSource slaveDataSource() { return DruidDataSourceBuilder.create().build(); } }对应的 yml 配置spring: datasource: druid: master: url: jdbc:mysql://master-host:3306/db username: master_user password: master_pass slave: url: jdbc:mysql://slave-host:3306/db username: slave_user password: slave_pass5. 生产环境注意事项5.1 安全加固修改默认密码一定要改掉 admin/123456 这种弱密码配置 IP 白名单stat-view-servlet: allow: 192.168.1.100,127.0.0.1禁用 Reset All避免误操作清空统计数据reset-enable: false5.2 性能调优连接数公式maxActive (核心数 * 2) 有效磁盘数超时设置maxWait应该略大于平均事务时间监控开销filters: stat会有 5% 性能损耗高并发场景可改用filters: mergeStat5.3 常见问题排查问题一监控页面无法访问检查url-pattern是否被 Security 拦截确认stat-view-servlet.enabledtrue问题二没有 SQL 监控数据检查filters是否包含stat确认使用的是 DruidDataSource问题三连接数不释放检查test-while-idle和validation-query用jstack检查连接持有线程6. 进阶功能探索6.1 与 Prometheus 集成通过简单配置暴露 Druid 监控指标dependency groupIdio.github.mweirauch/groupId artifactIdmicrometer-jvm-extras/artifactId version0.2.2/version /dependencyBean public DruidStatMetrics druidStatMetrics(){ return new DruidStatMetrics(); }6.2 动态配置刷新结合 Nacos 实现运行时参数调整RefreshScope Bean public DataSource dataSource( Value(${spring.datasource.url}) String url, // 其他参数... ) { return DruidDataSourceBuilder.create().build(); }6.3 定制监控页面克隆官方前端项目进行二次开发git clone https://github.com/alibaba/druid.git cd druid/src/main/resources/support/http/resources修改后重新打包资源文件即可替换默认界面。经过多个项目的实战验证Druid 已经成为我技术栈中不可或缺的组件。它就像数据库领域的听诊器让隐藏的性能问题无所遁形。特别是在微服务架构下每个服务配一个独立的监控面板比集中式监控系统更轻量灵活。如果你还没尝试过 Druid 的监控功能现在正是最佳时机。