问题描述
使用 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: true
url-pattern: /druid/*
# 配置监控统计的过滤器
web-stat-filter:
enabled: true
url-pattern: /*
针对 DynamicDataSource 的特殊考虑
由于您使用了动态数据源,还需要注意:
每个数据源的独立配置:确保为每个数据源单独配置连接池参数
默认数据源配置:为主数据源设置合理的默认值
连接池隔离:不同业务使用不同数据源时,连接池应完全隔离
优化实施建议
监控先行:先启用 Druid 的监控功能(
/druid
),分析当前连接池状态逐步调整:从保守参数开始,逐步调整到最优值
压力测试:调整后进行压力测试,观察连接池行为
日志分析:关注连接泄漏日志,修复应用代码中的连接泄漏问题
结合 PgSQL 配置:同时调整 PostgreSQL 的
max_connections
参数,确保与连接池配置协调
典型问题排查
如果发现连接数持续增长不释放,优先检查
remove-abandoned
相关配置如果出现连接获取超时,检查
max-wait
和max-active
配置如果出现连接失效问题,加强
validation-query
和空闲检测配置
通过以上优化,应该能有效解决连接不释放导致的堵塞问题。