当前位置:首页 > 数据库 > 经验总结

Druid-数据库连接池

导言

Druid是阿里巴巴开源的数据库连接池实现,提供了强大的性能监控和扩展功能。被称为是目前最好的数据库连接池,尤其是它的功能、性能、扩展性

简介

比对

连接池优点缺点与常见瓶颈
HikariCP性能最好,代码轻量,Spring Boot 2.x/3.x 默认;高并发下获取连接开销低。source_group_web_2监控能力较弱,没有 Druid 那种内置 Web 控制台;需要配合 Micrometer/Prometheus 做观测。source_group_web_3
Druid监控强,支持 SQL 统计、慢 SQL、连接泄漏检测、SQL 防火墙、密码加密;国内生态成熟。source_group_web_4功能多带来额外开销,高并发下通常略慢于 HikariCP;配置项较多,StatView 等组件要注意安全暴露。source_group_web_5
Tomcat JDBC Pool轻量,和 Tomcat 集成方便;支持异步获取连接。source_group_web_6性能一般,社区活跃度不如 HikariCP、Druid;功能也比较基础。source_group_web_7
DBCP2老牌稳定,文档多,兼容性好。source_group_web_8性能较弱,高并发下锁竞争和对象包装开销明显;新项目不建议使用。source_group_web_9
C3P0早期项目里常见,支持基础连接检测。source_group_web_10维护停滞,性能较差,配置复杂,存在潜在死锁风险;新项目应避开。source_group_web_11

参数说明

Druid 关键参数说明

参数建议值说明
initial-size5-10启动时初始化连接数,避免首次请求抖动。source_group_web_7
min-idle5-10保持一定预热连接,突发流量下响应更稳。source_group_web_8
max-active20-100最大活跃连接数。不要超过 MySQL max_connections 的合理比例。source_group_web_9
max-wait3000-60000获取连接最大等待时间。核心接口建议 3-5 秒,避免长时间阻塞。source_group_web_10
test-while-idletrue空闲时检测连接有效性,比 testOnBorrow 性能更好。source_group_web_11
time-between-eviction-runs-millis60000空闲连接检测间隔,建议 1-5 分钟。source_group_web_12
min-evictable-idle-time-millis300000空闲超过该时间的连接可能被回收。source_group_web_13
keep-alivetrue开启保活,减少因网络中间设备断开空闲连接导致的报错。source_group_web_14
filters: stat,wall建议开启stat 提供 SQL 监控,wall 提供 SQL 防火墙。source_group_web_15


最佳实践

参数作用最佳实践
initialSize初始化时建立的物理连接数建议与 minIdle 一致,避免冷启动抖动source_group_web_1
minIdle最小空闲连接数建议为 maxActive × 0.2 ~ 0.5,或 CPU 核数 × 1.5source_group_web_2
maxActive最大活跃连接数按 QPS 和 SQL 耗时计算,见下方公式source_group_web_3
maxWait获取连接最大等待时间建议 3000ms 左右,避免线程长期阻塞source_group_web_4
testWhileIdle空闲时检测连接有效性建议 true,配合 validationQuery 使用source_group_web_5
testOnBorrow借连接时检测有效性建议 false,高并发下性能损耗明显source_group_web_6
testOnReturn还连接时检测有效性建议 falsesource_group_web_7
validationQuery检测连接是否有效的 SQLMySQL 用 SELECT 1source_group_web_8
timeBetweenEvictionRunsMillis销毁线程检测间隔建议 10000 ~ 60000mssource_group_web_9
minEvictableIdleTimeMillis空闲连接最小存活时间建议 300000 ~ 1800000mssource_group_web_10
keepAlive对 minIdle 内连接保活建议 true,版本需 ≥ 1.1.21 更稳定source_group_web_11
keepAliveBetweenTimeMillis空闲多久执行保活检测建议 30000 ~ 120000mssource_group_web_12
maxEvictableIdleTimeMillis连接最大存活时间可设为 7 小时或根据 MySQL wait_timeout 调整source_group_web_13
poolPreparedStatements是否缓存 PreparedStatementMySQL 场景通常建议 falsesource_group_web_14
maxPoolPreparedStatementPerConnectionSize每个连接缓存 PS 数量若开启 PSCache,可设为 10 ~ 20source_group_web_15
filters扩展插件常用 stat,wall,分别做监控和 SQL 防火墙source_group_web_16

常用调优算法

maxActive ≈ (峰值QPS × 平均 SQL 耗时 ms) / 1000 × 1.2 ~ 1.5

minIdle ≈ maxActive × 0.2 ~ 0.5        minIdle ≈ CPU 核数 × 1.5

initialSize = minIdle

参数作用范围

参数类别作用域说明
initialSize / minIdle / maxActive连接池级别控制整个数据源的连接容量
maxWait连接池级别控制获取连接时的等待超时
testWhileIdle / testOnBorrow / testOnReturn连接池级别控制何时检测连接有效性
validationQuery连接池级别所有检测都共用这条 SQL
timeBetweenEvictionRunsMillis连接池级别销毁线程按这个间隔扫描整个池
minEvictableIdleTimeMillis / maxEvictableIdleTimeMillis连接池级别决定空闲连接是否被回收
keepAlive / keepAliveBetweenTimeMillis连接池级别对 minIdle 内连接做保活检测
poolPreparedStatements连接池级别控制是否开启 PSCache
maxPoolPreparedStatementPerConnectionSize每个物理连接级别限制单个连接缓存的 PreparedStatement 数量
filters数据源级别对整个数据源的连接和 SQL 生效

推荐示例组合

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5
      min-idle: 10
      max-active: 50
      max-wait: 3000
      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
      keep-alive-between-time-millis: 30000
      pool-prepared-statements: false
      filters: stat,wall

关键约束关系

  • keepAliveBetweenTimeMillis 应小于 minEvictableIdleTimeMillis,否则保活还没触发,连接可能已经被回收。

  • timeBetweenEvictionRunsMillis 不宜太大,否则失效连接回收慢。

  • maxWait 不宜过长,否则请求会堆积在线程池里。

  • maxActive 必须结合 MySQL max_connections、实例数量和业务峰值一起评估,不能只看单应用。

  • poolPreparedStatements 在 MySQL 场景下通常不建议开启,收益不明显。


扫描二维码推送至手机访问。

版权声明:本文由撒谎信发布,如需转载请注明出处。

本文链接:https://www.yangwuyu.com/?id=14

分享给朋友:

“Druid-数据库连接池” 的相关文章

GoldenDB告警脚本部署及基本使用

GoldenDB告警脚本部署及基本使用

GoldenDB-Sloth-告警部署和基础应用目 录1、 上传工具包(1) 将alarm告警工具压缩包上传至insight服务器中2、 复制文件3、 编辑配置文件(1) 编辑告警发送格式(2) 编辑告警发送渠道send.xml(3) 编辑告警过滤器filters.xml4、 启动告警检查…

RDS for MySQL aurora 高可用架构

RDS for MySQL aurora 高可用架构

Aurora 是阿里云 RDS 的集中式高可用决策与切换平台,采用五层架构 + CDDT 闭环(Check → Diagnose → Decision → Treat),通过 Flow 引擎(XML 编排)驱动切换流程,支持 MySQL、PostgreSQL、MongoDB、Redis、SQLSer…

MySQL系列-OPTIMIZE/ANALYZE

MySQL系列-OPTIMIZE/ANALYZE

OPTIMIZE OPTIMIZE TABLE database_name.table_name;短暂排他锁表。建议低峰期,重新组织表数据和索引的物理存储,减少碎片、释放未使用空间、提升 I/O 效率。宏观流程可以理解为在 Server 层 CREATE TABLE + INSERT SELECT…