0%

配置

Druid 连接池核心配置详解:优化数据库连接管理

Druid 是阿里巴巴开源的高性能数据库连接池,兼具连接管理、监控、SQL 防注入等功能,广泛应用于 Java 后端开发。合理配置 Druid 连接池参数对系统性能、稳定性至关重要。本文将基于官方配置表,深入解析核心参数的作用、默认值及最佳实践,帮助你针对性优化连接池配置。

基础配置:连接建立与身份验证

核心身份认证参数

配置项 缺省值 作用与最佳实践
name 自动生成(DataSource-哈希值 用于多数据源场景的区分标识,监控时便于识别。1.0.5 版本前存在配置 bug,建议 1.0.5+ 版本使用。
url 无(必填) 数据库连接 URL(如 jdbc:mysql://localhost:3306/db),需包含数据库名、编码等参数(如 useUnicode=true&characterEncoding=utf8)。
username 无(必填) 数据库登录用户名,建议使用最小权限账号(仅授予必要操作权限)。
password 无(必填) 数据库登录密码,生产环境需加密存储(可通过 Druid 的 ConfigFilter 解密)。
driverClassName 自动识别 数据库驱动类名(如 com.mysql.cj.jdbc.Driver)。Druid 可通过 url 自动识别,建议显式配置以避免歧义。

配置示例

1
2
3
4
5
6
# 基础连接配置  
spring.datasource.druid.name=primary-db
spring.datasource.druid.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
spring.datasource.druid.username=app_user
spring.datasource.druid.password=EncryptedPassword # 建议加密
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

连接池大小与资源控制

连接池大小直接影响系统并发能力和资源占用,需根据业务压力合理配置。

核心池大小参数

配置项 缺省值 作用与最佳实践
initialSize 0 初始化连接数。建议设置为 5-10(避免首次请求耗时过长),但不宜过大(启动时建立连接耗时)。
maxActive 8 最大连接数。需根据数据库最大连接数(如 MySQL 默认 max_connections=151)和业务并发量调整,建议 20-50(避免超过数据库承载上限)。
minIdle 无默认值 最小空闲连接数。建议设置为 5-10,避免频繁创建 / 销毁连接(空闲连接可复用)。
maxWait 无默认值 获取连接的最大等待时间(毫秒)。建议设置 3000-5000,超时抛出异常,避免线程无限阻塞。

配置原则

  • 避免过度配置maxActive 不应超过数据库允许的最大连接数(否则会报 too many connections 错误);
  • 空闲连接复用minIdle 确保一定数量的热连接,减少连接建立开销;
  • 突发流量缓冲maxActive 需覆盖业务峰值并发(如通过压测确定合理值)。

配置示例

1
2
3
4
5
# 连接池大小配置  
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=30
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-wait=3000 # 3秒超时

连接有效性检测与保活

连接池需定期检测连接有效性,避免使用失效连接(如数据库重启后连接断裂)。

核心检测参数

配置项 缺省值 作用与最佳实践
validationQuery 无默认值 检测连接有效性的 SQL 语句(如 MySQL 用 select 1,Oracle 用 select 1 from dual)。必须配置,否则检测机制无效。
validationQueryTimeout 无默认值 检测超时时间(秒)。建议设置 1-3 秒,避免检测耗时过长。
testOnBorrow true 申请连接时检测有效性。建议设为 false(每次检测会降低性能),改用 testWhileIdle
testOnReturn false 归还连接时检测有效性。建议保持 false(性能损耗大,非核心场景无需开启)。
testWhileIdle false 空闲时检测有效性。强烈建议设为 true(不影响性能,且能及时清理无效连接)。
timeBetweenEvictionRunsMillis 60000ms(1 分钟) 检测线程运行间隔(毫秒)。建议保持默认或设为 30000(30 秒),平衡检测频率和性能。

连接保活配置(1.0.28+)

配置项 缺省值 作用与最佳实践
keepAlive false 启用空闲连接保活。建议设为 true,对 minIdle 范围内的空闲连接执行保活操作(避免被数据库主动关闭)。
minEvictableIdleTimeMillis 无默认值 连接空闲多久后可被保活 / 驱逐(毫秒)。建议设为 300000(5 分钟),与数据库 wait_timeout 配合(需小于数据库超时时间)。

配置示例

1
2
3
4
5
6
7
8
9
# 连接检测与保活配置  
spring.datasource.druid.validation-query=select 1 # MySQL 检测语句
spring.datasource.druid.validation-query-timeout=2
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.time-between-eviction-runs-millis=30000 # 30秒检测一次
spring.datasource.druid.keep-alive=true # 启用保活
spring.datasource.druid.min-evictable-idle-time-millis=300000 # 5分钟空闲触发保活

扩展插件与监控配置

Druid 提供丰富插件,支持监控、日志、SQL 防注入等功能,需通过 filters 配置启用。

核心插件配置

配置项 缺省值 作用与最佳实践
filters 启用插件(逗号分隔)。常用组合:stat,wall,log4j2(监控 + 防注入 + 日志)。
proxyFilters 自定义插件列表。需通过代码配置,用于高级扩展(如自定义监控逻辑)。

常用插件说明

  • stat:监控统计插件,记录 SQL 执行时间、连接使用情况等(需配合 Druid 监控页面);
  • wall:SQL 防注入插件,拦截恶意 SQL(如 DROP TABLE),保护数据库安全;
  • log4j2/logback:日志插件,记录连接申请、释放、SQL 执行等日志(便于问题排查)。

配置示例

1
2
3
4
5
6
7
8
# 插件配置  
spring.datasource.druid.filters=stat,wall,log4j2
# 监控统计拦截的慢 SQL 阈值(毫秒)
spring.datasource.druid.filter.stat.slow-sql-millis=2000
spring.datasource.druid.filter.stat.log-slow-sql=true
# 防注入配置(允许的 SQL 语法)
spring.datasource.druid.filter.wall.enabled=true
spring.datasource.druid.filter.wall.db-type=mysql

其他重要配置

预处理语句缓存(PSCache)

配置项 缺省值 作用与最佳实践
poolPreparedStatements false 是否缓存 PreparedStatement(PSCache)。MySQL 建议关闭(PSCache 作用有限),Oracle 建议开启(提升游标复用效率)。
maxPoolPreparedStatementPerConnectionSize -1 PSCache 最大缓存数。启用时建议设为 20-50,避免内存占用过高。

连接初始化 SQL

配置项 缺省值 作用与最佳实践
connectionInitSqls 连接建立后执行的初始化 SQL(如设置会话变量 set names utf8mb4)。多语句用逗号分隔。

并发与锁配置

配置项 缺省值 作用与最佳实践
useUnfairLock false 是否使用非公平锁。高并发场景下建议设为 true(提升锁获取效率),但可能导致个别线程等待超时。
asyncInit false 异步初始化连接。initialSize 较大时建议设为 true(加快应用启动速度)。

生产环境最佳配置示例

结合上述分析,推荐一套生产环境通用配置(MySQL 为例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# Druid 生产环境配置(MySQL)  
spring.datasource.druid.name=primary-db
spring.datasource.druid.url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC&autoReconnect=true
spring.datasource.druid.username=app_user
spring.datasource.druid.password=EncryptedPassword # 加密存储
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver

# 连接池大小
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=30
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-wait=3000

# 连接检测与保活
spring.datasource.druid.validation-query=select 1
spring.datasource.druid.validation-query-timeout=2
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.time-between-eviction-runs-millis=30000
spring.datasource.druid.keep-alive=true
spring.datasource.druid.min-evictable-idle-time-millis=300000

# 插件与监控
spring.datasource.druid.filters=stat,wall,log4j2
spring.datasource.druid.filter.stat.slow-sql-millis=2000
spring.datasource.druid.filter.stat.log-slow-sql=true
spring.datasource.druid.filter.wall.enabled=true

# 其他配置
spring.datasource.druid.connection-init-sqls=set names utf8mb4
spring.datasource.druid.use-unfair-lock=true
spring.datasource.druid.async-init=true
spring.datasource.druid.pool-prepared-statements=false # MySQL 关闭 PSCache

常见问题与解决方案

1. 连接泄露

  • 现象:连接数持续增长,最终达到 maxActive 导致无法获取连接;
  • 排查:通过 Druid 监控页面查看 activeCountpoolingCount,确认是否有未释放的连接;
  • 解决:检查代码中 Connection 是否正确关闭(使用 try-with-resources 语法)。

2. 慢 SQL 导致连接阻塞

  • 现象:部分连接长时间占用,导致连接池耗尽;
  • 排查:通过 stat 插件日志查看慢 SQL,优化 SQL 或增加超时控制;
  • 解决:设置 spring.datasource.druid.filter.stat.slow-sql-millis 监控慢 SQL,针对性优化。

3. 数据库重启后连接失效

  • 现象:数据库重启后,应用报 Communications link failure 错误;
  • 解决:确保 testWhileIdle=truekeepAlive=true,让 Druid 自动清理并重建无效连接。

欢迎关注我的其它发布渠道