Back to Druid

连接池配置指南 | Connection Pool Guide

doc/connection-pool-guide.md

1.2.287.5 KB
Original Source

连接池配置指南 | Connection Pool Guide

English | 中文


中文

基本配置

DruidDataSource 是 Druid 的核心连接池实现。以下是完整的配置参数说明:

必选参数

参数说明示例
urlJDBC 连接 URLjdbc:mysql://localhost:3306/mydb
username数据库用户名root
password数据库密码password

连接池容量

参数默认值说明
initialSize0初始化时创建的物理连接数
maxActive8最大连接池数量
minIdle0最小空闲连接数
maxWait-1获取连接最大等待时间(毫秒),-1 表示无限等待

连接检测

参数默认值说明
validationQuery-连接有效性检测 SQL(如 SELECT 1
validationQueryTimeout-1检测超时时间(秒)
testOnBorrowfalse获取连接时检测有效性
testOnReturnfalse归还连接时检测有效性
testWhileIdletrue空闲时检测有效性(推荐开启)

连接回收

参数默认值说明
timeBetweenEvictionRunsMillis60000回收线程执行间隔(毫秒)
minEvictableIdleTimeMillis1800000连接最小空闲时间,超过则可被回收(30分钟)
maxEvictableIdleTimeMillis25200000连接最大空闲时间,超过则强制回收(7小时)
keepAlivefalse是否对空闲连接发送心跳保活
keepAliveBetweenTimeMillis120000KeepAlive 间隔时间(毫秒)

PreparedStatement 缓存

参数默认值说明
poolPreparedStatementsfalse是否启用 PSCache
maxPoolPreparedStatementPerConnectionSize10每个连接的 PSCache 大小

提示: 调用 setMaxPoolPreparedStatementPerConnectionSize(n)(n > 0)会自动开启 poolPreparedStatements = true,无需手动设置。

配置示例

Java 代码配置

java
DruidDataSource dataSource = new DruidDataSource();

// 基本配置
dataSource.setUrl("jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8");
dataSource.setUsername("root");
dataSource.setPassword("password");

// 连接池容量
dataSource.setInitialSize(5);
dataSource.setMaxActive(20);
dataSource.setMinIdle(5);
dataSource.setMaxWait(60000);

// 连接检测
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestWhileIdle(true);
dataSource.setTestOnBorrow(false);
dataSource.setTestOnReturn(false);

// 连接回收
dataSource.setTimeBetweenEvictionRunsMillis(60000);
dataSource.setMinEvictableIdleTimeMillis(1800000);

// KeepAlive
dataSource.setKeepAlive(true);
dataSource.setKeepAliveBetweenTimeMillis(120000);

// PSCache(MySQL 建议关闭,Oracle/DB2/PostgreSQL 建议开启)
dataSource.setPoolPreparedStatements(false);

// Filter
dataSource.setFilters("stat,wall");

// 初始化
dataSource.init();

Spring Boot 配置(application.yml)

yaml
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8
    username: root
    password: password
    druid:
      initial-size: 5
      max-active: 20
      min-idle: 5
      max-wait: 60000
      validation-query: SELECT 1
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 1800000
      keep-alive: true
      filters: stat,wall

最佳实践

1. 连接池大小

根据应用并发量合理设置:

场景initialSizeminIdlemaxActive
小型应用(< 50 QPS)2210
中型应用(50-500 QPS)5520
大型应用(> 500 QPS)101050

经验公式: maxActive ≈ 数据库可承载最大连接数 / 应用节点数,同时确保 maxActive >= 单节点最大并发线程数

2. 连接检测策略

  • 推荐启用 testWhileIdle — 在空闲检测时验证连接,性能开销最小
  • 生产环境慎用 testOnBorrow — 每次获取连接都会执行检测 SQL,高并发下有性能影响
  • 必须设置 validationQuery — 否则连接检测无法生效

3. 超时配置

yaml
# 获取连接等待超时(避免无限等待)
max-wait: 60000

# 防止连接泄漏(开发环境推荐)
remove-abandoned: true
remove-abandoned-timeout: 300
log-abandoned: true

4. MySQL 特定配置

yaml
spring:
  datasource:
    url: jdbc:mysql://host:3306/db?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false
    druid:
      validation-query: SELECT 1
      pool-prepared-statements: false  # MySQL 不建议开启 PSCache

5. Oracle 特定配置

yaml
spring:
  datasource:
    url: jdbc:oracle:thin:@host:1521:sid
    druid:
      validation-query: SELECT 1 FROM DUAL
      pool-prepared-statements: true   # Oracle 建议开启 PSCache
      max-pool-prepared-statement-per-connection-size: 20

连接泄漏检测

当应用存在连接泄漏(获取连接后未正确关闭)时,可启用 RemoveAbandoned 功能:

java
dataSource.setRemoveAbandoned(true);
dataSource.setRemoveAbandonedTimeout(300); // 300 秒
dataSource.setLogAbandoned(true);          // 记录泄漏连接的堆栈

注意: removeAbandoned 仅建议在开发和测试环境使用。生产环境应通过代码审查和测试确保连接正确关闭。


English

Basic Configuration

DruidDataSource is Druid's core connection pool implementation.

Required Parameters

ParameterDescriptionExample
urlJDBC connection URLjdbc:mysql://localhost:3306/mydb
usernameDatabase usernameroot
passwordDatabase passwordpassword

Pool Capacity

ParameterDefaultDescription
initialSize0Number of physical connections created at initialization
maxActive8Maximum number of connections in the pool
minIdle0Minimum number of idle connections
maxWait-1Maximum wait time (ms) to get a connection; -1 means infinite

Connection Validation

ParameterDefaultDescription
validationQuery-SQL used to validate connections (e.g., SELECT 1)
testOnBorrowfalseValidate on connection acquisition
testOnReturnfalseValidate on connection return
testWhileIdletrueValidate idle connections (recommended)

Connection Eviction

ParameterDefaultDescription
timeBetweenEvictionRunsMillis60000Eviction thread interval (ms)
minEvictableIdleTimeMillis1800000Minimum idle time before eviction (30 min)
maxEvictableIdleTimeMillis25200000Maximum idle time, force eviction (7 hours)
keepAlivefalseSend heartbeats to idle connections

Best Practices

  1. Enable testWhileIdle — lowest overhead validation strategy
  2. Always set validationQuery — required for validation to work
  3. Set maxWait — avoid infinite waits in high-concurrency scenarios
  4. Disable poolPreparedStatements for MySQL — enable for Oracle/DB2/PostgreSQL. Note: calling setMaxPoolPreparedStatementPerConnectionSize(n) with n > 0 auto-enables PSCache
  5. Use removeAbandoned in dev/test — helps detect connection leaks