Druid
Druid 是阿里巴巴开源的 Java 数据库连接池,在提供高性能连接管理的同时,内置了 SQL 监控、慢 SQL 统计、防 SQL 注入(Wall 过滤器)等功能,是国内 Java 生产环境中使用最广泛的连接池之一。
同类方案:HikariCP(Spring Boot 默认,性能更高但监控功能弱)、C3P0(老旧,已淘汰)。
Spring Boot 集成
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.2.21</version>
</dependency>核心配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
username: root
password: 123456
druid:
# 连接池大小
initial-size: 5 # 初始化连接数
min-idle: 5 # 最小空闲连接数
max-active: 20 # 最大活跃连接数
# 超时配置
max-wait: 60000 # 获取连接最大等待时间(ms)
time-between-eviction-runs-millis: 60000 # 检测空闲连接的间隔(ms)
min-evictable-idle-time-millis: 300000 # 连接最小空闲时间,超过则回收
max-evictable-idle-time-millis: 900000 # 连接最大空闲时间
# 连接有效性检测
validation-query: SELECT 1
test-while-idle: true # 空闲时检测(推荐开启)
test-on-borrow: false # 借出时检测(影响性能,关闭)
test-on-return: false # 归还时检测
# 过滤器
filters: stat,wall,slf4j
# 合并相同参数的 SQL,慢 SQL 阈值 500ms
connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500监控配置
Druid 内置 Web 监控台,访问 http://host:port/druid/index.html 可查看 SQL 统计、连接池状态、慢 SQL 等。
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
url-pattern: /druid/*
login-username: admin
login-password: admin123
reset-enable: false # 禁止重置统计数据
allow: 127.0.0.1 # 白名单(生产环境务必限制 IP)
web-stat-filter:
enabled: true
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.css,/druid/*"
session-stat-enable: trueWall 过滤器(防 SQL 注入)
spring:
datasource:
druid:
filter:
wall:
enabled: true
config:
delete-allow: false # 禁止无 WHERE 条件的 DELETE
drop-table-allow: false # 禁止 DROP TABLE
multi-statement-allow: false # 禁止多语句(防注入)慢 SQL 监控
spring:
datasource:
druid:
filter:
stat:
enabled: true
slow-sql-millis: 500 # 超过 500ms 记为慢 SQL
log-slow-sql: true # 打印慢 SQL 日志
merge-sql: true # 合并参数相同的 SQL监控台 SQL 监控 页可查看每条 SQL 的执行次数、最大/平均耗时、错误次数。
多数据源
@Configuration
public class DataSourceConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource.master")
public DataSource masterDataSource() {
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties("spring.datasource.slave")
public DataSource slaveDataSource() {
return DruidDataSourceBuilder.create().build();
}
}spring:
datasource:
master:
url: jdbc:mysql://master-host:3306/mydb
username: root
password: 123456
slave:
url: jdbc:mysql://slave-host:3306/mydb
username: root
password: 123456常用监控 API
@Autowired
private DruidDataSource dataSource;
int active = dataSource.getActiveCount(); // 活跃连接数
int idle = dataSource.getPoolingCount(); // 空闲连接数
long wait = dataSource.getWaitThreadCount(); // 等待线程数
long connect = dataSource.getConnectCount(); // 累计获取连接次数
long error = dataSource.getConnectErrorCount(); // 连接错误次数
String statJson = dataSource.getStatDataAsJson(); // 输出完整统计 JSONDruid vs HikariCP
| 维度 | Druid | HikariCP |
|---|---|---|
| 性能 | 高 | 更高(Spring Boot 默认) |
| 监控 | 内置 Web 监控台、SQL 统计 | 无(需接 Micrometer) |
| 防注入 | Wall 过滤器 | 无 |
| 慢 SQL 统计 | 内置 | 无 |
| 多数据源 | 方便 | 方便 |
| 适用场景 | 需要精细监控和安全控制 | 追求极致性能 |
常见问题
连接泄漏检测
spring:
datasource:
druid:
remove-abandoned: true # 开启泄漏检测
remove-abandoned-timeout: 1800 # 借出超过 1800s 视为泄漏
log-abandoned: true # 打印泄漏连接的堆栈连接池耗尽排查
max-active设置过小- 连接泄漏(未关闭连接,开启
remove-abandoned检测) - 慢 SQL 长期占用连接(查监控台慢 SQL 页)
- 事务未提交/回滚(检查
@Transactional边界)
时区问题
url: ...?serverTimezone=Asia/Shanghai&characterEncoding=utf8