1. Spring Boot整合Druid监控全攻略
在Java企业级应用开发中,数据库连接池的选择直接影响系统性能和稳定性。作为阿里巴巴开源的数据库连接池,Druid以其卓越的性能和全面的监控功能脱颖而出。结合Spring Boot的自动化配置特性,我们可以快速构建一个既高效又可观测的数据访问层。本文将手把手带你完成从基础整合到高级监控的全流程实现。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础整合
2.1 依赖配置
首先在pom.xml中添加必要依赖:
xml复制<dependencies>
<!-- Spring Boot Starter JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- Druid连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
<!-- 数据库驱动(以MySQL为例) -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
2.2 基础配置
在application.yml中配置Druid基本参数:
yaml复制spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC
username: root
password: your_password
driver-class-name: com.mysql.cj.jdbc.Driver
druid:
# 连接池配置
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
# 监控配置
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin123
reset-enable: false
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
注意:生产环境务必修改默认的login-username和login-password,避免安全风险
3. 监控功能深度配置
3.1 SQL监控与防火墙
Druid的SQL监控功能可以记录所有执行的SQL语句及其执行时间、返回行数等信息。要启用完整监控功能,需要添加以下配置:
yaml复制spring:
datasource:
druid:
# SQL监控配置
filters: stat,wall,log4j
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
enabled: true
config:
delete-allow: false
drop-table-allow: false
3.2 监控页面定制
默认监控页面位于/druid路径下。我们可以通过Java配置类进行深度定制:
java复制@Configuration
public class DruidConfig {
@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet() {
ServletRegistrationBean<StatViewServlet> bean =
new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
// 初始化参数配置
Map<String,String> initParams = new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","admin123");
initParams.put("allow",""); // 默认允许所有访问
// initParams.put("deny","192.168.1.100"); // 拒绝某个IP
bean.setInitParameters(initParams);
return bean;
}
@Bean
public FilterRegistrationBean<WebStatFilter> webStatFilter() {
FilterRegistrationBean<WebStatFilter> bean =
new FilterRegistrationBean<>(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
4. 监控数据解读与实战分析
4.1 关键监控指标解析
Druid监控面板提供的主要指标包括:
- 数据源:活跃连接数、等待线程数等
- SQL监控:执行次数、最慢SQL、执行时间分布
- SQL防火墙:拦截的非法SQL
- Web应用:URI访问统计
- Session监控:活跃会话数
4.2 性能优化实战
通过监控数据我们可以进行针对性优化:
-
连接池大小调整:
- 如果ActiveCount经常接近MaxActive,考虑增大max-active
- 如果IdleCount长期大于InitialSize,考虑减小initial-size
-
SQL优化:
- 在"SQL监控"页签中识别执行时间超过slow-sql-millis的慢查询
- 对高频执行的SQL检查是否可以使用缓存
-
异常检测:
- 在"SQL防火墙"页签检查被拦截的危险操作
- 在"Web应用"页签识别异常请求模式
5. 高级功能与生产实践
5.1 多数据源监控
对于多数据源场景,每个数据源都需要独立配置监控:
java复制@Configuration
public class MultiDataSourceConfig {
@Primary
@Bean(name = "primaryDataSource")
@ConfigurationProperties("spring.datasource.druid.primary")
public DataSource primaryDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@ConfigurationProperties("spring.datasource.druid.secondary")
public DataSource secondaryDataSource() {
return DruidDataSourceBuilder.create().build();
}
// 为每个数据源配置独立的监控
@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet() {
// 配置同单数据源...
}
}
5.2 与Prometheus集成
将Druid监控数据接入Prometheus监控系统:
- 添加Micrometer依赖:
xml复制<dependency>
<groupId>io.micrometer</groupId>
<artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
- 配置Druid指标暴露:
java复制@Bean
public DruidStatMetrics druidStatMetrics(@Qualifier("dataSource") DataSource dataSource) {
return new DruidStatMetrics(dataSource);
}
- 在application.yml中启用端点:
yaml复制management:
endpoints:
web:
exposure:
include: health,info,prometheus,druid
6. 常见问题排查
6.1 监控页面无法访问
可能原因及解决方案:
-
路径配置错误:
- 检查stat-view-servlet.url-pattern配置
- 确保没有其他拦截器拦截了/druid/*路径
-
权限问题:
- 确认login-username和login-password输入正确
- 检查allow/deny配置是否限制了当前IP
-
过滤器冲突:
- 检查web-stat-filter.exclusions配置
- 尝试暂时关闭Security等可能冲突的组件
6.2 监控数据不准确
常见问题处理:
-
SQL监控缺失:
- 确认filters配置包含stat
- 检查filter.stat.enabled=true
-
合并SQL问题:
- 对于预编译SQL,设置merge-sql=true
- 检查SQL是否被防火墙拦截
-
连接池数据延迟:
- Druid监控数据默认有几分钟延迟
- 重要场景可以调用DruidDataSource.getXXX()方法获取实时数据
7. 生产环境最佳实践
-
安全加固:
- 务必修改默认监控账号密码
- 通过allow/deny限制访问IP
- 考虑通过Nginx添加Basic Auth二次验证
-
性能调优:
- 根据监控数据动态调整连接池参数
- 定期归档监控数据避免内存占用过高
-
高可用方案:
- 对于关键系统,考虑部署Druid监控数据持久化
- 将监控数据接入企业统一监控平台
-
版本管理:
- 保持Druid版本更新,及时修复安全漏洞
- 升级前充分测试,注意配置项变更
在实际项目中,我发现Druid的监控功能特别适合以下场景:当系统出现数据库性能瓶颈时,通过Druid监控可以快速定位是连接池配置不当还是SQL语句问题。曾经遇到过一个生产环境问题,系统在高峰期响应变慢,通过Druid监控发现大量连接处于等待状态,适当增大max-active后问题立即解决。
