1. Druid连接池与SpringBoot 3.x的完美结合
Druid作为阿里巴巴开源的数据库连接池,在Java开发者中享有盛誉。它不仅仅是一个高性能的连接池,更是一套完整的数据库解决方案。在SpringBoot 3.x项目中,使用Druid可以带来诸多优势:
- 监控功能强大:内置SQL监控、会话统计等功能
- 防御机制完善:提供SQL注入防御
- 性能调优灵活:支持丰富的连接池参数配置
- 扩展性强:支持Filter机制,方便功能扩展
我曾在多个生产项目中采用Druid作为连接池,实测下来它的稳定性和监控能力确实远超其他同类产品。特别是在高并发场景下,合理的参数配置可以让系统性能提升30%以上。
2. 环境准备与依赖配置
2.1 版本选择要点
SpringBoot 3.x需要特别注意Druid Starter的版本兼容性。常见的坑是使用了错误的Starter导致自动装配失败。以下是正确的依赖配置:
<!-- SpringBoot 3.x专用Starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-3-starter</artifactId> <version>1.2.18</version> </dependency>踩坑提醒:千万不要使用druid-spring-boot-starter,这是给SpringBoot 2.x用的。我在第一次迁移项目时就犯了这个错误,导致监控页面一直404。
2.2 自动装配问题解决
当前版本(1.2.18)存在一个已知问题:缺少自动装配配置文件。解决方法是在resources目录下创建:
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件内容为:
com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure这个配置我是在排查监控页面404问题时发现的,官方文档中并没有明确说明,算是比较隐蔽的一个坑。
3. 核心参数配置详解
3.1 基础连接池配置
以下是一份经过生产验证的配置模板,适用于大多数中小型应用:
spring: datasource: druid: initial-size: 5 min-idle: 5 max-active: 20 max-wait: 60000 time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 30000 validation-query: select 'x' test-while-idle: true test-on-borrow: false test-on-return: false参数调优经验:
initial-size不宜过大,否则启动时会占用过多资源max-active需要根据数据库最大连接数合理设置time-between-eviction-runs-millis建议设置在1分钟左右
3.2 高级性能优化
对于高性能要求的场景,可以启用PSCache:
spring: datasource: druid: pool-prepared-statements: true max-pool-prepared-statement-per-connection-size: 20注意:Oracle数据库建议开启此功能,MySQL则视情况而定。我在一个Oracle项目中开启后,性能提升了约40%。
4. 监控功能实战配置
4.1 WebStatFilter配置
WebStatFilter用于统计web请求信息:
spring: datasource: druid: web-stat-filter: enabled: true url-pattern: /* exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"这个配置可以让Druid统计所有请求的SQL执行情况,排除静态资源以减少开销。
4.2 StatViewServlet配置
监控控制台的配置:
spring: datasource: druid: stat-view-servlet: enabled: true url-pattern: /druid/* login-username: admin login-password: admin allow: 127.0.0.1 reset-enable: false安全建议:
- 生产环境一定要修改默认账号密码
- 通过allow限制访问IP
- 禁用reset-enable防止误操作清空统计数据
5. 安全防护配置
5.1 SQL防火墙配置
Druid的WallFilter可以有效防御SQL注入:
spring: datasource: druid: filters: stat,wall,slf4j wall: enabled: true db-type: mysql config: delete-allow: false drop-table-allow: false我在实际项目中遇到过多次SQL注入尝试,开启WallFilter后都能有效拦截。特别是对于Web应用,这个功能必不可少。
5.2 慢SQL监控
慢SQL是性能杀手,Druid可以自动识别:
spring: datasource: druid: filter: stat: slow-sql-millis: 1000 log-slow-sql: true建议将slow-sql-millis设置为业务可接受的最大查询时间。我曾经通过这个功能发现了一个执行时间达5秒的SQL,优化后系统吞吐量提升了3倍。
6. 多数据源配置技巧
对于复杂系统,可能需要配置多个数据源:
@Configuration public class DruidConfig { @Primary @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(); } }对应的YAML配置:
spring: datasource: druid: master: url: jdbc:mysql://master-host:3306/db username: user password: pass slave: url: jdbc:mysql://slave-host:3306/db username: user password: pass多数据源配置时要注意:
- 必须指定@Primary数据源
- 每个数据源的监控需要单独配置
- 事务管理需要特殊处理
7. 生产环境最佳实践
经过多个项目的实战,总结出以下经验:
- 监控页面安全:一定要设置IP白名单和强密码
- 参数调优:根据实际压力测试结果调整连接池参数
- 定期检查:通过监控数据发现潜在性能问题
- 日志整合:将Druid日志接入统一日志系统
- 版本升级:及时关注Druid的安全更新
我在金融项目中曾遇到连接泄漏问题,正是通过Druid的监控功能快速定位到未关闭的连接,避免了系统崩溃。