1. 为什么需要整合Druid监控
在Spring Boot项目中引入Druid连接池并配置监控功能,这已经成为企业级应用开发的标配做法。我经历过多个从HikariCP切换到Druid的生产项目,最直接的感受是:当系统出现数据库性能瓶颈时,Druid提供的监控数据能帮我们快速定位问题根源。
去年我们有个电商项目在促销期间出现数据库连接泄漏,正是通过Druid的监控页面发现有个DAO方法执行后没有关闭连接。Druid的SQL监控功能可以清晰看到每条SQL的执行时间、执行次数和连接占用情况,这是其他连接池无法比拟的优势。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 项目环境准备
2.1 基础依赖配置
在pom.xml中添加以下核心依赖(建议使用Druid 1.2.8+版本):
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
注意:不要同时引入其他连接池依赖(如HikariCP),避免冲突
2.2 数据库基础配置
application.yml中配置数据源:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
3. Druid监控配置详解
3.1 监控控制台配置
创建配置类DruidConfig:
java复制@Configuration
public class DruidConfig {
@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet() {
ServletRegistrationBean<StatViewServlet> bean =
new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
// 监控页面账号密码
bean.addInitParameter("loginUsername", "admin");
bean.addInitParameter("loginPassword", "admin123");
// 允许访问的IP(默认允许所有)
bean.addInitParameter("allow", "");
// 禁止访问的IP
bean.addInitParameter("deny", "192.168.1.100");
return bean;
}
@Bean
public FilterRegistrationBean<WebStatFilter> webStatFilter() {
FilterRegistrationBean<WebStatFilter> bean =
new FilterRegistrationBean<>(new WebStatFilter());
// 添加过滤规则
bean.addUrlPatterns("/*");
// 忽略过滤的格式
bean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return bean;
}
}
3.2 监控功能参数调优
在application.yml中补充Druid性能监控参数:
yaml复制spring:
datasource:
druid:
# 监控配置
stat-view-servlet:
enabled: true
login-username: admin
login-password: admin123
reset-enable: false
web-stat-filter:
enabled: true
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
# 连接池配置
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
# 监控统计配置
filters: stat,wall
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 1000
wall:
enabled: true
config:
drop-table-allow: false
4. 监控功能使用实战
4.1 访问监控控制台
启动应用后访问:http://localhost:8080/druid
输入配置的用户名密码(示例中为admin/admin123)即可看到如下功能模块:
- 数据源:显示连接池基本状态和运行情况
- SQL监控:记录所有执行的SQL及其性能指标
- SQL防火墙:防御SQL注入攻击
- Web应用:URI访问统计
- Session监控:用户会话跟踪(需额外配置)
- JSON API:监控数据接口
4.2 关键监控指标解读
在SQL监控页面,需要特别关注以下指标:
| 指标名称 | 健康值范围 | 异常处理建议 |
|---|---|---|
| 执行次数 | - | 高频SQL需要考虑优化或缓存 |
| 执行时间 | <100ms | 超过1秒的SQL必须优化 |
| 最慢 | <500ms | 检查是否缺少索引 |
| 执行+RS时间 | <300ms | 结果集过大时考虑分页 |
| 读取行数 | <1000行 | 检查是否必要字段查询 |
| 更新行数 | - | 批量操作需控制事务大小 |
4.3 慢SQL监控配置
在开发环境建议开启慢SQL日志:
yaml复制spring:
datasource:
druid:
filter:
stat:
slow-sql-millis: 500 # 超过500毫秒视为慢SQL
log-slow-sql: true
生产环境建议设置为1000毫秒,避免日志量过大。
5. 生产环境注意事项
5.1 安全加固措施
- 必须修改默认密码:admin/admin这种弱密码绝对不能出现在生产环境
- 限制访问IP:通过allow参数只允许运维网络访问
- 禁用reset功能:配置reset-enable: false防止误操作清空统计数据
- HTTPS访问:通过Nginx配置HTTPS转发
5.2 性能优化建议
-
合理设置连接池参数:
- 初始连接数(initialSize) = 正常并发量 × 20%
- 最大连接数(maxActive) = 正常并发量 × 150%
-
定期监控连接泄漏:
sql复制SELECT * FROM information_schema.innodb_trx
WHERE TIME_TO_SEC(timediff(now(),trx_started)) > 60;
- WallFilter配置:
yaml复制filter:
wall:
config:
delete-allow: false # 禁止delete不带where条件
merge-allow: false # 禁止merge语法
6. 常见问题排查
6.1 监控页面无法访问
现象:访问/druid返回404或空白页
排查步骤:
- 检查是否添加了druid-starter依赖
- 确认stat-view-servlet.enabled=true
- 检查是否有其他Filter拦截了/druid路径
- 查看启动日志是否有Druid初始化报错
6.2 SQL监控不显示数据
现象:SQL执行后监控页面无记录
解决方案:
- 检查filters配置是否包含stat
- 尝试在启动类添加注解:
java复制@SpringBootApplication(exclude = {
DataSourceAutoConfiguration.class
})
- 检查是否有多数据源冲突
6.3 监控数据不准确
现象:统计数值明显异常
处理方法:
- 检查是否配置了多个DruidDataSource实例
- 确认没有在其他地方手动重置统计数据
- 检查Druid版本是否过旧(建议1.2.6+)
7. 高级功能扩展
7.1 集成Prometheus监控
在pom.xml添加:
xml复制<dependency>
<groupId>io.github.mweirauch</groupId>
<artifactId>micrometer-jvm-extras</artifactId>
<version>0.2.2</version>
</dependency>
配置类新增:
java复制@Bean
public DruidStatMetrics druidStatMetrics(){
return new DruidStatMetrics();
}
7.2 多数据源监控
对于多数据源场景,每个DataSource都需要独立配置:
java复制@Primary
@Bean
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.druid.slave")
public DataSource slaveDataSource() {
DataSource dataSource = DruidDataSourceBuilder.create().build();
// 需要单独注册监控
StatFilter statFilter = new StatFilter();
statFilter.setLogSlowSql(true);
statFilter.setMergeSql(true);
statFilter.setSlowSqlMillis(1000);
try {
dataSource.getProxyFilters().add(statFilter);
} catch (SQLException e) {
logger.error("监控配置失败", e);
}
return dataSource;
}
在实际项目中,Druid监控帮我们发现了多次SQL注入攻击尝试和N+1查询问题。建议至少每周检查一次慢SQL排行,对于执行次数TOP10的SQL要特别关注其执行效率。
