SpringBoot3 + Druid + DynamicDataSource + PgSQL 连接池优化方案

发布于:2025-05-11 ⋅ 阅读:(20) ⋅ 点赞:(0)

问题描述

使用 SpringBoot + Druid + DynamicDataSource + PgSQL 时遇到的连接过多未释放问题,一方面是升级DB Core对DB做Tuning,另一方面是优化Druid数据库连接池方案。

关键优化方向

  1. 连接泄漏检测与回收

  2. 连接有效性验证

  3. 合理的连接池大小配置

  4. 闲置连接回收

  5. 超时控制

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 的特殊考虑

由于您使用了动态数据源,还需要注意:

  1. 每个数据源的独立配置:确保为每个数据源单独配置连接池参数

  2. 默认数据源配置:为主数据源设置合理的默认值

  3. 连接池隔离:不同业务使用不同数据源时,连接池应完全隔离

优化实施建议

  1. 监控先行:先启用 Druid 的监控功能(/druid),分析当前连接池状态

  2. 逐步调整:从保守参数开始,逐步调整到最优值

  3. 压力测试:调整后进行压力测试,观察连接池行为

  4. 日志分析:关注连接泄漏日志,修复应用代码中的连接泄漏问题

  5. 结合 PgSQL 配置:同时调整 PostgreSQL 的max_connections参数,确保与连接池配置协调

典型问题排查

  1. 如果发现连接数持续增长不释放,优先检查remove-abandoned相关配置

  2. 如果出现连接获取超时,检查max-waitmax-active配置

  3. 如果出现连接失效问题,加强validation-query和空闲检测配置

通过以上优化,应该能有效解决连接不释放导致的堵塞问题。


网站公告

今日签到

点亮在社区的每一天
去签到