SpringBoot3 + Druid + DynamicDataSource + PgSQL 连接池优化方案
问题描述
使用 SpringBoot + Druid + DynamicDataSource + PgSQL 时遇到的连接过多未释放问题,一方面是升级DB Core对DB做Tuning,另一方面是优化Druid数据库连接池方案。
关键优化方向
-
连接泄漏检测与回收
-
连接有效性验证
-
合理的连接池大小配置
-
闲置连接回收
-
超时控制
Druid 连接池关键优化参数
基础配置
spring:datasource:druid:# 初始化连接数initial-size: 5# 最小空闲连接数min-idle: 5# 最大活跃连接数max-active: 20# 获取连接时最大等待时间(毫秒)max-wait: 60000
连接泄漏检测
# 是否启用泄漏检测remove-abandoned: true# 连接泄漏超时时间(秒)remove-abandoned-timeout: 300# 泄漏检测日志log-abandoned: true
连接有效性验证
# 申请连接时检测test-on-borrow: true# 归还连接时检测test-on-return: false# 空闲时检测test-while-idle: true# 验证查询(PostgreSQL)validation-query: SELECT 1# 验证查询超时时间(秒)validation-query-timeout: 1# 空闲连接检测间隔(毫秒)time-between-eviction-runs-millis: 60000# 连接最小空闲时间(毫秒)min-evictable-idle-time-millis: 300000# 保持空闲连接存活的最小时长(毫秒)keep-alive: true
超时控制
# 连接超时时间(秒)connect-timeout: 10# 查询超时时间(秒)query-timeout: 30# 事务超时时间(秒)transaction-query-timeout: 30
监控配置
# 启用监控统计stat-view-servlet:enabled: trueurl-pattern: /druid/*# 配置监控统计的过滤器web-stat-filter:enabled: trueurl-pattern: /*
针对 DynamicDataSource 的特殊考虑
由于您使用了动态数据源,还需要注意:
-
每个数据源的独立配置:确保为每个数据源单独配置连接池参数
-
默认数据源配置:为主数据源设置合理的默认值
-
连接池隔离:不同业务使用不同数据源时,连接池应完全隔离
优化实施建议
-
监控先行:先启用 Druid 的监控功能(
/druid
),分析当前连接池状态 -
逐步调整:从保守参数开始,逐步调整到最优值
-
压力测试:调整后进行压力测试,观察连接池行为
-
日志分析:关注连接泄漏日志,修复应用代码中的连接泄漏问题
-
结合 PgSQL 配置:同时调整 PostgreSQL 的
max_connections
参数,确保与连接池配置协调
典型问题排查
-
如果发现连接数持续增长不释放,优先检查
remove-abandoned
相关配置 -
如果出现连接获取超时,检查
max-wait
和max-active
配置 -
如果出现连接失效问题,加强
validation-query
和空闲检测配置
通过以上优化,应该能有效解决连接不释放导致的堵塞问题。