1. 为什么选择Druid连接池
在Java应用开发中,数据库连接池的选择直接影响着系统性能和稳定性。Druid作为阿里巴巴开源的数据库连接池,已经成为国内Java开发者的首选方案。我曾在多个生产项目中实测对比过HikariCP、DBCP等主流连接池,Druid在监控功能和SQL防注入方面的表现尤为突出。
Druid的核心优势在于它不仅仅是连接池,更是一套完整的数据源解决方案。相比其他连接池,它内置了:
- 实时监控:可查看SQL执行情况、连接池状态等关键指标
- 防御SQL注入:通过WallFilter提供生产级防护
- 可扩展性:支持通过Filter机制扩展功能
- 性能统计:精确到毫秒级的SQL执行时间统计
特别是在Spring Boot 3.x环境下,官方推出的druid-spring-boot-3-starter让集成变得更加简单。这个starter自动处理了Bean注册和配置绑定,开发者只需关注核心配置即可。
2. 快速集成Druid到Spring Boot 3.x
2.1 添加必要依赖
首先在pom.xml中添加starter依赖。注意Spring Boot 3.x需要专门适配的starter:
<dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>1.2.20</version> </dependency> <!-- MySQL驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>这里有个实际项目中的经验:如果同时使用MyBatis等ORM框架,建议排除掉其自带的连接池依赖,避免冲突。比如:
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>3.0.2</version> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency>2.2 基础配置示例
在application.yml中配置最基本的数据源参数:
spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/demo?useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 druid: initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000这个配置已经能让连接池正常工作。initial-size建议设置为与min-idle相同,避免连接频繁创建销毁。max-active需要根据数据库最大连接数合理设置,我一般从20开始,根据监控数据逐步调整。
3. 生产级配置优化
3.1 连接池核心参数
对于生产环境,建议配置完整的连接池参数:
druid: # 连接检测配置 test-while-idle: true test-on-borrow: false test-on-return: false validation-query: SELECT 1 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 # 性能相关 pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20 filters: stat,wall,slf4j # 监控配置 stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin web-stat-filter: enabled: true url-pattern: /* exclusions: "*.js,*.gif,*.jpg,*.css,/druid/*"关键参数说明:
- time-between-eviction-runs-millis:检测空闲连接的间隔时间,单位毫秒
- filters:启用stat(监控)、wall(防火墙)、slf4j(日志)三个内置过滤器
- pool-prepared-statements:开启预编译语句池提升性能
3.2 慢SQL监控配置
Druid可以自动记录执行时间超过阈值的SQL:
druid: filter: stat: log-slow-sql: true slow-sql-millis: 1000 merge-sql: true这个功能在排查性能问题时非常有用。实际项目中,我通常先设置为1秒,运行一段时间后根据统计结果调整阈值。merge-sql可以将相似SQL合并统计,避免大量重复记录。
4. 监控面板实战指南
4.1 访问监控面板
启动应用后,访问http://localhost:8080/druid/login.html,输入配置的用户名密码即可进入监控中心。主要功能模块包括:
- 数据源:查看连接池当前状态
- SQL监控:所有SQL的执行统计
- SQL防火墙:拦截的非法SQL
- Web应用:URI访问统计
- Session监控:活跃会话信息
4.2 关键监控指标解读
在数据源面板中,这几个指标需要特别关注:
- 活跃连接数(ActiveCount):如果长期接近max-active,说明需要扩容
- 等待线程数(WaitThreadCount):大于0表示连接不足
- 执行时间分布:关注>1s的SQL比例
我曾遇到一个案例:某接口偶尔超时,通过Druid监控发现是某个SQL在高峰时段执行时间从50ms飙升到2s,最终定位到是缺少索引导致。
4.3 安全注意事项
- 一定要修改默认密码:生产环境务必配置复杂密码
- 限制访问IP:通过allow/deny配置白名单
- 禁用Reset All:避免误操作清空统计数据
druid: stat-view-servlet: reset-enable: false allow: 192.168.1.100,127.0.0.1 deny: 192.168.1.2005. 高级功能与问题排查
5.1 多数据源配置
实际项目中经常需要配置多个数据源。Spring Boot下可以通过创建多个DataSource Bean实现:
@Configuration public class MultiDataSourceConfig { @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(); } }对应配置:
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.2 常见问题排查
问题1:监控页面无法访问
- 检查
stat-view-servlet.enabled是否为true - 确认没有安全框架拦截
/druid/**路径 - 查看启动日志是否有Druid初始化报错
问题2:连接泄漏表现是连接数不断增长直到max-active。可以通过开启泄漏检测:
druid: remove-abandoned: true remove-abandoned-timeout: 300 log-abandoned: true这个配置会回收超过300秒未关闭的连接,并在日志中记录警告。
问题3:监控数据不准确检查是否配置了filters: stat。如果使用MyBatis,还需要确保:
druid: aop-patterns: com.xxx.mapper.*6. 性能优化建议
根据实际项目经验,分享几个优化技巧:
- 合理设置max-wait:从1分钟开始,根据业务容忍度调整
- 开启PS Cache:对PreparedStatement进行缓存
- 定期检查连接有效性:test-while-idle和validation-query配合使用
- 监控连接获取时间:关注getConnection()耗时
一个典型的生产环境配置示例:
druid: max-wait: 3000 # 3秒超时 pool-prepared-statements: true max-open-prepared-statements: 100 validation-query: SELECT 1 FROM dual test-while-idle: true time-between-eviction-runs-millis: 60000在电商大促前,我们通过调整这些参数,将数据库连接获取成功率从95%提升到了99.99%。