doc/connection-pool-guide.md
DruidDataSource 是 Druid 的核心连接池实现。以下是完整的配置参数说明:
| 参数 | 说明 | 示例 |
|---|---|---|
url | JDBC 连接 URL | jdbc:mysql://localhost:3306/mydb |
username | 数据库用户名 | root |
password | 数据库密码 | password |
| 参数 | 默认值 | 说明 |
|---|---|---|
initialSize | 0 | 初始化时创建的物理连接数 |
maxActive | 8 | 最大连接池数量 |
minIdle | 0 | 最小空闲连接数 |
maxWait | -1 | 获取连接最大等待时间(毫秒),-1 表示无限等待 |
| 参数 | 默认值 | 说明 |
|---|---|---|
validationQuery | - | 连接有效性检测 SQL(如 SELECT 1) |
validationQueryTimeout | -1 | 检测超时时间(秒) |
testOnBorrow | false | 获取连接时检测有效性 |
testOnReturn | false | 归还连接时检测有效性 |
testWhileIdle | true | 空闲时检测有效性(推荐开启) |
| 参数 | 默认值 | 说明 |
|---|---|---|
timeBetweenEvictionRunsMillis | 60000 | 回收线程执行间隔(毫秒) |
minEvictableIdleTimeMillis | 1800000 | 连接最小空闲时间,超过则可被回收(30分钟) |
maxEvictableIdleTimeMillis | 25200000 | 连接最大空闲时间,超过则强制回收(7小时) |
keepAlive | false | 是否对空闲连接发送心跳保活 |
keepAliveBetweenTimeMillis | 120000 | KeepAlive 间隔时间(毫秒) |
| 参数 | 默认值 | 说明 |
|---|---|---|
poolPreparedStatements | false | 是否启用 PSCache |
maxPoolPreparedStatementPerConnectionSize | 10 | 每个连接的 PSCache 大小 |
提示: 调用
setMaxPoolPreparedStatementPerConnectionSize(n)(n > 0)会自动开启poolPreparedStatements = true,无需手动设置。
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:
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
根据应用并发量合理设置:
| 场景 | initialSize | minIdle | maxActive |
|---|---|---|---|
| 小型应用(< 50 QPS) | 2 | 2 | 10 |
| 中型应用(50-500 QPS) | 5 | 5 | 20 |
| 大型应用(> 500 QPS) | 10 | 10 | 50 |
经验公式:
maxActive ≈ 数据库可承载最大连接数 / 应用节点数,同时确保maxActive >= 单节点最大并发线程数
testWhileIdle — 在空闲检测时验证连接,性能开销最小testOnBorrow — 每次获取连接都会执行检测 SQL,高并发下有性能影响validationQuery — 否则连接检测无法生效# 获取连接等待超时(避免无限等待)
max-wait: 60000
# 防止连接泄漏(开发环境推荐)
remove-abandoned: true
remove-abandoned-timeout: 300
log-abandoned: true
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
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 功能:
dataSource.setRemoveAbandoned(true);
dataSource.setRemoveAbandonedTimeout(300); // 300 秒
dataSource.setLogAbandoned(true); // 记录泄漏连接的堆栈
注意:
removeAbandoned仅建议在开发和测试环境使用。生产环境应通过代码审查和测试确保连接正确关闭。
DruidDataSource is Druid's core connection pool implementation.
| Parameter | Description | Example |
|---|---|---|
url | JDBC connection URL | jdbc:mysql://localhost:3306/mydb |
username | Database username | root |
password | Database password | password |
| Parameter | Default | Description |
|---|---|---|
initialSize | 0 | Number of physical connections created at initialization |
maxActive | 8 | Maximum number of connections in the pool |
minIdle | 0 | Minimum number of idle connections |
maxWait | -1 | Maximum wait time (ms) to get a connection; -1 means infinite |
| Parameter | Default | Description |
|---|---|---|
validationQuery | - | SQL used to validate connections (e.g., SELECT 1) |
testOnBorrow | false | Validate on connection acquisition |
testOnReturn | false | Validate on connection return |
testWhileIdle | true | Validate idle connections (recommended) |
| Parameter | Default | Description |
|---|---|---|
timeBetweenEvictionRunsMillis | 60000 | Eviction thread interval (ms) |
minEvictableIdleTimeMillis | 1800000 | Minimum idle time before eviction (30 min) |
maxEvictableIdleTimeMillis | 25200000 | Maximum idle time, force eviction (7 hours) |
keepAlive | false | Send heartbeats to idle connections |
testWhileIdle — lowest overhead validation strategyvalidationQuery — required for validation to workmaxWait — avoid infinite waits in high-concurrency scenariospoolPreparedStatements for MySQL — enable for Oracle/DB2/PostgreSQL. Note: calling setMaxPoolPreparedStatementPerConnectionSize(n) with n > 0 auto-enables PSCacheremoveAbandoned in dev/test — helps detect connection leaks