1. 项目概述
作为一名长期奋战在一线的Java开发者,我深知数据库连接池在项目中的重要性。最近在Spring Boot 3项目中尝试集成Druid连接池,发现其监控功能确实强大,但配置过程中也踩了不少坑。本文将详细记录从零开始集成Druid的全过程,包括核心配置解析、监控面板使用技巧以及实际开发中的优化建议。
Druid作为阿里巴巴开源的数据库连接池,相比Spring Boot默认的HikariCP,最大的优势在于其全面的监控能力和丰富的扩展功能。对于需要细致监控SQL性能、慢查询等指标的项目来说,Druid是不二之选。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与依赖配置
2.1 项目基础环境
在开始集成前,确保你的项目满足以下条件:
- JDK 17+(Spring Boot 3最低要求)
- Spring Boot 3.x
- MySQL 8.x(其他数据库也支持,本文以MySQL为例)
- Maven构建工具
2.2 添加Druid依赖
对于Spring Boot 3项目,需要使用专门的starter包。在pom.xml中添加以下依赖:
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.23</version>
</dependency>
注意:Spring Boot 2.x项目应使用
druid-spring-boot-starter,版本号也有所不同。使用错误的starter会导致兼容性问题。
3. 详细配置解析
3.1 从properties迁移到YAML
建议将原有的application.properties转换为application.yml,YAML格式在复杂配置场景下更清晰易读。以下是完整的Druid配置示例:
yaml复制spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/your_db?useSSL=false&serverTimezone=UTC
username: your_username
password: your_password
druid:
# 连接池基础配置
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
# 连接有效性检测配置
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 连接回收策略
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
# 监控统计相关配置
filters: stat,wall,slf4j
use-global-data-source-stat: true
connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# Web监控过滤器配置
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
# 监控页面配置
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin
reset-enable: false
allow: 127.0.0.1
deny: 192.168.1.100
3.2 关键配置项详解
3.2.1 连接池大小配置
initial-size: 建议设置为与min-idle相同,避免应用启动后频繁创建连接max-active: 生产环境建议根据数据库最大连接数和应用实例数合理设置max-wait: 获取连接超时时间,单位毫秒。高并发场景可适当增大
3.2.2 监控过滤器配置
filters: 必须配置stat才能启用监控功能wall过滤器提供SQL防火墙功能,可防止SQL注入slf4j将SQL日志输出到SLF4J,便于统一日志管理
3.2.3 监控页面安全配置
- 务必修改默认的
login-username和login-password allow和deny可限制访问IP,生产环境必须配置reset-enable建议设为false,防止监控数据被意外清除
4. 监控功能使用指南
4.1 访问监控面板
启动应用后,访问http://localhost:8080/druid/login.html,输入配置的用户名密码即可进入监控首页。
监控面板主要功能模块:
- 数据源:查看连接池状态和基本配置
- SQL监控:实时统计SQL执行情况
- SQL防火墙:展示被拦截的SQL
- Web应用:监控URI访问情况
- Session监控:跟踪用户会话
- JSON API:提供监控数据的JSON接口
4.2 SQL监控实践
在开发过程中,我特别依赖SQL监控功能来优化查询性能。以下是一些实用技巧:
- 识别慢查询:配置
druid.stat.slowSqlMillis=500后,执行时间超过500ms的SQL会被标记为慢查询 - 分析SQL执行效率:关注"执行时间"和"执行次数"两列,找出最耗时的SQL
- 监控SQL并发:通过"并发数"可以识别是否存在连接泄漏问题
实际案例:曾通过监控发现一个分页查询平均耗时1.2s,检查后发现是缺少索引导致,添加索引后降至200ms内。
4.3 安全注意事项
- 生产环境一定要:
- 修改默认登录凭证
- 限制访问IP
- 禁用reset功能
- 监控页面路径
/druid/*可以自定义,但建议保持默认以避免猜测 - 考虑添加二次认证,如集成公司统一认证系统
5. 性能优化建议
5.1 连接池参数调优
根据实际负载情况调整以下参数:
| 参数名 | 默认值 | 优化建议 | 说明 |
|---|---|---|---|
| max-active | 20 | 50-100 | 高并发应用可适当增大 |
| max-wait | 60000 | 3000-10000 | 避免长时间等待连接 |
| min-idle | 5 | 10-20 | 减少连接创建开销 |
| time-between-eviction-runs-millis | 60000 | 30000 | 更频繁检测空闲连接 |
5.2 监控性能影响
启用监控会带来约5-10%的性能开销,可通过以下方式降低影响:
- 生产环境只开启必要的过滤器:
yaml复制filters: stat,wall - 增大监控数据采集间隔:
yaml复制druid: stat: merge-sql: true log-slow-sql: true slow-sql-millis: 1000 # 只记录1秒以上的慢SQL
5.3 多数据源配置
对于需要连接多个数据库的场景,可按以下方式配置:
java复制@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();
}
@Bean
@Primary
public DynamicDataSource dataSource(DataSource masterDataSource, DataSource slaveDataSource) {
Map<Object, Object> targetDataSources = new HashMap<>();
targetDataSources.put("master", masterDataSource);
targetDataSources.put("slave", slaveDataSource);
return new DynamicDataSource(masterDataSource, targetDataSources);
}
}
对应的YAML配置:
yaml复制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_pass
6. 常见问题排查
6.1 监控页面无法访问
可能原因及解决方案:
stat-view-servlet.enabled未设置为true- 访问路径不正确,默认是
/druid/* - IP被deny列表拦截
- 过滤器顺序问题,确保Druid过滤器优先
6.2 SQL监控无数据
检查步骤:
- 确认
filters包含stat - 检查
use-global-data-source-stat是否为true - 查看应用日志是否有Druid相关错误
- 尝试执行一些SQL后刷新监控页面
6.3 连接泄漏检测
通过以下配置开启连接泄漏检测:
yaml复制druid:
remove-abandoned: true
remove-abandoned-timeout: 1800 # 30分钟
log-abandoned: true
当连接未在指定时间内关闭时,Druid会回收连接并在日志中记录警告。
7. 生产环境最佳实践
经过多个项目的实践验证,总结以下经验:
- 监控分离:将监控页面部署在独立的管理端口,与业务端口隔离
- 定期备份:利用Druid的JSON API定期导出监控数据进行分析
- 告警集成:通过扩展Druid的StatLogger接口,将慢SQL告警接入公司监控系统
- 动态配置:结合Spring Cloud Config实现运行时动态调整连接池参数
以下是一个自定义StatLogger的示例:
java复制@Component
public class CustomStatLogger extends StatLogger {
private static final Logger logger = LoggerFactory.getLogger(CustomStatLogger.class);
@Override
public void log(SqlStat stat) {
if (stat.getExecuteMillisTotal() > 1000) {
logger.warn("Slow SQL detected: {}, execution time: {}ms",
stat.getSql(), stat.getExecuteMillisTotal());
// 发送告警通知
}
}
}
在项目中使用Druid一年多来,其强大的监控能力帮助我们发现了多个潜在性能问题。特别是在一次大促前的压力测试中,通过Druid监控快速定位到几个未使用索引的查询,及时优化避免了线上事故。
