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: true

Wall 过滤器(防 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(); // 输出完整统计 JSON

Druid vs HikariCP

维度DruidHikariCP
性能更高(Spring Boot 默认)
监控内置 Web 监控台、SQL 统计无(需接 Micrometer)
防注入Wall 过滤器
慢 SQL 统计内置
多数据源方便方便
适用场景需要精细监控和安全控制追求极致性能

常见问题

连接泄漏检测

spring:
  datasource:
    druid:
      remove-abandoned: true          # 开启泄漏检测
      remove-abandoned-timeout: 1800  # 借出超过 1800s 视为泄漏
      log-abandoned: true             # 打印泄漏连接的堆栈

连接池耗尽排查

  1. max-active 设置过小
  2. 连接泄漏(未关闭连接,开启 remove-abandoned 检测)
  3. 慢 SQL 长期占用连接(查监控台慢 SQL 页)
  4. 事务未提交/回滚(检查 @Transactional 边界)

时区问题

url: ...?serverTimezone=Asia/Shanghai&characterEncoding=utf8

相关链接

  • HikariCP — Spring Boot 默认连接池,与 Druid 选型对比
  • 连接池原理与指标 — 参数与耗尽排查通用概念
  • MySQL — Druid 最常搭配的关系型数据库
  • Redis — 缓存层,与连接池配合减少数据库压力
  • Caffeine — 进程内缓存,与连接池互补构建多级缓存
  • ShardingSphere — 分库分表场景下管理多个 Druid 数据源