1. 为什么选择Druid连接池
在Spring Boot项目中,数据库连接池的选择直接影响着应用的性能和稳定性。Druid作为阿里巴巴开源的数据库连接池实现,相比HikariCP、Tomcat JDBC等方案有几个显著优势:
首先,Druid提供了完善的监控功能。通过内置的StatFilter和WallFilter,可以实时监控SQL执行情况、慢查询统计以及防御SQL注入攻击。这在生产环境排查性能问题时特别有用,比如我们发现某个API响应变慢,通过Druid监控可以快速定位到是哪些SQL执行时间过长。
其次,Druid对国内开发者更友好。它的文档和社区支持都比较完善,遇到问题时更容易找到解决方案。我在实际项目中就遇到过HikariCP在某些国产数据库上的兼容性问题,而Druid由于在国内使用广泛,对各种数据库的适配更好。
从性能角度看,虽然HikariCP的基准测试数据更好看,但在实际业务场景中,Druid的性能表现已经足够优秀。特别是在连接泄漏检测、连接保持策略等方面,Druid提供了更多可配置项,适合对数据库连接有特殊要求的场景。
提示:如果项目已经使用HikariCP且运行良好,没有必要专门切换为Druid。但当需要监控功能或遇到HikariCP兼容性问题时,Druid是个不错的选择。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 集成druid-spring-boot-starter
2.1 基础依赖配置
在Spring Boot项目中集成Druid最方便的方式就是使用druid-spring-boot-starter。首先在pom.xml中添加依赖:
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.16</version>
</dependency>
这个starter会自动引入Druid的核心库和Spring Boot的自动配置类。相比手动配置Druid,使用starter可以省去大量样板代码。
2.2 基础数据源配置
在application.yml中配置数据源:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
druid:
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
这里有几个关键参数需要注意:
initial-size: 连接池初始化时创建的连接数min-idle: 连接池中保持的最小空闲连接数max-active: 连接池中最大活跃连接数max-wait: 获取连接时最大等待时间(毫秒)
2.3 连接池参数调优建议
根据我的经验,连接池参数的设置应该根据实际业务场景来调整:
- 对于低并发应用(如后台管理系统),
max-active可以设置在10-20之间 - 高并发应用(如电商系统)可能需要50-100甚至更多
max-wait不宜设置过长,一般1-3秒足够,避免线程长时间阻塞min-idle和initial-size可以设置为相同值,减少连接创建开销
3. 启用Druid监控功能
3.1 配置监控过滤器
Druid的监控功能需要通过Filter来实现。在application.yml中添加以下配置:
yaml复制spring:
datasource:
druid:
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,*.png,*.css,*.ico,/druid/*"
这段配置做了三件事:
- 启用了stat(统计)、wall(防火墙)、slf4j(日志)三个过滤器
- 配置了监控页面的访问路径和登录认证
- 设置了Web统计过滤器的URL匹配规则
3.2 访问监控页面
启动应用后,访问http://localhost:8080/druid,输入配置的用户名密码即可看到监控页面。这里有几个特别有用的功能:
- 数据源:查看连接池的基本信息和当前状态
- SQL监控:统计所有SQL的执行次数、执行时间、最慢SQL等
- SQL防火墙:展示被拦截的SQL和攻击类型
- Web应用:统计URI的访问情况
注意:生产环境一定要修改默认的登录用户名和密码,避免安全风险。
3.3 监控数据采集
Druid的监控数据默认保存在内存中,应用重启后会丢失。如果需要持久化监控数据,可以集成Prometheus:
java复制@Configuration
public class DruidPrometheusConfig {
@Bean
public DruidStatCollector druidStatCollector() {
return new DruidStatCollector() {
@Override
public void collect(List<Map<String, Object>> stats) {
// 将stats数据发送到Prometheus
}
};
}
}
4. 高级功能配置
4.1 防御SQL注入
Druid的WallFilter可以防御SQL注入攻击。在配置文件中添加:
yaml复制spring:
datasource:
druid:
wall:
enabled: true
config:
delete-allow: false
drop-table-allow: false
none-base-statement-allow: false
这些配置会:
- 禁止DELETE语句
- 禁止DROP TABLE语句
- 禁止没有WHERE条件的UPDATE语句
4.2 连接泄漏检测
Druid可以检测连接泄漏(获取连接后未关闭)。配置如下:
yaml复制spring:
datasource:
druid:
remove-abandoned: true
remove-abandoned-timeout: 180
log-abandoned: true
当连接获取后超过180秒未关闭,Druid会回收该连接并在日志中记录警告。
4.3 多数据源配置
对于需要连接多个数据库的场景,可以这样配置:
java复制@Configuration
public class MultiDataSourceConfig {
@Bean
@ConfigurationProperties("spring.datasource.druid.one")
public DataSource dataSourceOne() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.druid.two")
public DataSource dataSourceTwo() {
return DruidDataSourceBuilder.create().build();
}
}
对应的application.yml配置:
yaml复制spring:
datasource:
druid:
one:
url: jdbc:mysql://localhost:3306/db1
username: user1
password: pass1
two:
url: jdbc:mysql://localhost:3306/db2
username: user2
password: pass2
5. 常见问题排查
5.1 监控页面无法访问
如果访问/druid返回404,检查以下几点:
- 确保
stat-view-servlet.enabled=true - 检查是否有安全框架(如Spring Security)拦截了该路径
- 查看启动日志是否有Druid相关的错误
5.2 连接泄漏问题
当看到日志中有"abandoned connection"警告时:
- 检查代码中是否有忘记关闭连接的情况
- 使用try-with-resources确保连接自动关闭:
java复制try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement()) {
// 执行SQL
}
5.3 性能问题
如果发现数据库操作变慢:
- 查看Druid监控中的慢SQL统计
- 检查连接池是否过小(看活跃连接数是否接近max-active)
- 考虑启用Druid的SQL合并功能:
yaml复制spring:
datasource:
druid:
filters: stat,mergeStat
connection-properties: druid.stat.mergeSql=true
我在实际项目中遇到过这样一个案例:一个批量导入功能开始时很快,运行一段时间后越来越慢。通过Druid监控发现是连接池设置过小,导致大量线程在等待获取连接。将max-active从20调整到50后问题解决。
6. 生产环境建议
-
监控告警:将Druid的监控数据接入公司监控系统,设置活跃连接数、慢SQL等指标的告警阈值。
-
定期维护:数据库表结构变更后,建议重启应用使Druid重新初始化连接池。
-
参数调优:根据业务高峰期和低峰期的压力变化,动态调整连接池参数。可以使用Spring Cloud Config等配置中心实现动态刷新。
-
安全防护:
- 修改监控页面的默认路径和登录凭证
- 限制监控页面的访问IP
- 定期检查WallFilter的拦截日志
-
版本升级:关注Druid的版本更新,及时修复已知漏洞。升级前在测试环境充分验证。
我在多个生产项目中都使用Druid作为连接池,它的稳定性和监控功能确实给运维带来了很大便利。特别是在排查一些棘手的性能问题时,Druid提供的详细统计数据往往能快速定位到问题根源。
