1. 为什么需要Druid连接池
在Spring Boot项目中直接使用原生JDBC连接数据库会面临几个典型问题:每次请求都创建新连接导致性能损耗、无法有效管理连接生命周期、缺乏监控统计功能。而Druid作为阿里巴巴开源的数据库连接池实现,在性能和数据监控方面具有明显优势。
我去年接手的一个电商项目就遇到过连接泄漏问题。当时系统在促销活动时频繁出现数据库连接耗尽的情况,通过引入Druid的监控功能,我们很快定位到是某个查询未正确关闭连接。Druid的SQL监控和连接泄漏检测功能帮我们节省了大量排查时间。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Spring Boot 3集成Druid
2.1 基础依赖配置
在pom.xml中添加最新依赖(2023年8月验证版本):
xml复制<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.18</version>
</dependency>
注意:Spring Boot 3.x必须使用druid-spring-boot-3-starter,传统starter会出现兼容性问题
2.2 基础配置示例
application.yml配置示例:
yaml复制spring:
datasource:
url: jdbc:mysql://localhost:3306/test_db
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
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
关键参数说明:
- initial-size:启动时建立的连接数
- max-active:最大活跃连接数(根据服务器配置调整)
- max-wait:获取连接最长等待时间(毫秒)
- time-between-eviction-runs-millis:连接检测间隔
3. 高级功能配置
3.1 监控页面配置
添加WebStatFilter和StatViewServlet配置类:
java复制@Configuration
public class DruidConfig {
@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet() {
ServletRegistrationBean<StatViewServlet> bean =
new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
// 添加IP白名单
bean.addInitParameter("allow", "127.0.0.1");
// 控制台管理用户名密码
bean.addInitParameter("loginUsername", "admin");
bean.addInitParameter("loginPassword", "123456");
return bean;
}
@Bean
public FilterRegistrationBean<WebStatFilter> webStatFilter() {
FilterRegistrationBean<WebStatFilter> bean =
new FilterRegistrationBean<>(new WebStatFilter());
// 添加过滤规则
bean.addUrlPatterns("/*");
// 忽略过滤格式
bean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.css,/druid/*");
return bean;
}
}
访问地址:http://localhost:8080/druid
3.2 SQL防火墙配置
防止恶意SQL注入的配置:
yaml复制spring:
datasource:
druid:
filters: stat,wall
wall:
config:
delete-allow: false
drop-table-allow: false
none-base-statement-allow: false
3.3 多数据源配置
对于需要连接多个数据库的场景:
java复制@Configuration
public class MultiDataSourceConfig {
@Primary
@Bean(name = "masterDataSource")
@ConfigurationProperties("spring.datasource.druid.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean(name = "slaveDataSource")
@ConfigurationProperties("spring.datasource.druid.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
}
对应application.yml配置:
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
4. 性能优化实践
4.1 连接池参数调优
生产环境推荐配置(8核16G服务器):
yaml复制spring:
datasource:
druid:
initial-size: 10
min-idle: 10
max-active: 50
max-wait: 5000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: false
test-on-return: false
filters: stat,wall,slf4j
4.2 监控指标解读
关键监控指标说明:
| 指标名称 | 健康值范围 | 异常处理建议 |
|---|---|---|
| ActiveCount | ≤max-active的80% | 检查是否有慢SQL或连接泄漏 |
| PoolingCount | ≥min-idle | 适当增加initial-size |
| WaitThreadCount | 长期>0 | 增大max-active或优化SQL |
| ExecuteCount | 根据业务量波动 | 突增需检查是否被攻击 |
4.3 连接泄漏检测
开启泄漏检测配置:
yaml复制spring:
datasource:
druid:
remove-abandoned: true
remove-abandoned-timeout: 1800
log-abandoned: true
警告:remove-abandoned在生产环境慎用,建议只在测试阶段开启
5. 常见问题排查
5.1 连接池耗尽问题
现象:报错"get connection timeout"
排查步骤:
- 检查Druid监控页面的ActiveCount
- 分析SQL监控找出耗时操作
- 检查是否有未关闭的连接
解决方案:
java复制// 确保使用try-with-resources关闭连接
try (Connection conn = dataSource.getConnection();
Statement stmt = conn.createStatement()) {
// 业务代码
}
5.2 监控页面无法访问
可能原因:
- 未正确注册StatViewServlet
- 拦截器拦截了/druid路径
- 权限配置错误
解决方案:
java复制@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthInterceptor())
.excludePathPatterns("/druid/**");
}
}
5.3 性能监控数据不准
配置建议:
yaml复制spring:
datasource:
druid:
filter:
stat:
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
6. 生产环境最佳实践
- 监控页面必须设置访问权限
- 定期检查连接泄漏(建议每周)
- 根据业务峰值调整max-active
- 开启慢SQL监控(>1秒)
- 使用单独的监控账号连接数据库
我在金融项目中总结的配置模板:
yaml复制spring:
datasource:
druid:
stat-view-servlet:
enabled: true
allow: 10.10.10.10
deny: 192.168.1.100
login-username: monitor
login-password: $加密密码
web-stat-filter:
enabled: true
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
filter:
stat:
enabled: true
log-slow-sql: true
slow-sql-millis: 500
merge-sql: true
wall:
enabled: true
config:
delete-allow: false
drop-table-allow: false
