当前位置: 首页 > news >正文

数据库连接池如何进行空闲管理

文章目录

  • Question
  • Answer
    • 一、Druid的空闲连接管理机制
    • 二、空闲连接的删除时机
    • 三、使用被删除的空闲连接报错的原因及解决方案
      • 报错原因
      • 解决方案
      • 总结

Question

mysql druid数据库连接池如何进行空闲管理?
什么时候空闲连接会删除?
使用了被删除的空闲连接报错怎么办?

Answer

Druid数据库连接池的空闲连接管理是其核心功能之一,通过精细化的配置实现连接的高效复用与资源释放。以下从空闲管理机制、空闲连接删除时机、以及报错解决方案三个方面详细说明:

一、Druid的空闲连接管理机制

Druid通过定期检查+空闲阈值控制实现空闲连接管理,核心依赖以下配置参数(均为DruidDataSource的属性):

  1. timeBetweenEvictionRunsMillis
  • 含义:连接池定期检查空闲连接的时间间隔(毫秒),默认值为30000ms(30秒)。
  • 作用:每隔该时间,Druid会启动一个线程对连接池中的连接进行检查,判断是否需要回收。
  1. minEvictableIdleTimeMillis
  • 含义:连接的最小空闲时间(毫秒),默认值为300000ms(5分钟)。
  • 作用:一个连接如果空闲时间超过该值,才会被纳入“可回收”范围(但不一定立即回收,需结合其他条件)。
  1. maxEvictableIdleTimeMillis
  • 含义:连接的最大空闲时间(毫秒),默认值为25200000ms(7小时)。
  • 作用:一个连接如果空闲时间超过该值,无论连接池是否需要保持最小连接数,都会被强制回收(优先级高于minEvictableIdleTimeMillis)。
  1. minIdle
  • 含义:连接池保持的最小空闲连接数,默认值为0。
  • 作用:定期检查时,若空闲连接数超过minIdle,且部分连接的空闲时间已超过minEvictableIdleTimeMillis,则会回收超出的部分(确保保留至少minIdle个空闲连接)。
  1. testWhileIdle
  • 含义:是否在检查空闲连接时验证连接有效性,默认值为true
  • 作用:检查时会执行validationQuery(如SELECT 1)验证连接是否存活,若无效则直接回收(即使未达到空闲阈值)。

二、空闲连接的删除时机

Druid会在以下两种情况下删除空闲连接:

  1. 定期检查触发回收
    每隔timeBetweenEvictionRunsMillis时间,检查线程会执行以下逻辑:
  • 对所有空闲连接,计算其空闲时间(从上次使用到当前的时间)。
  • 若连接空闲时间 > maxEvictableIdleTimeMillis:无论是否超过minIdle,直接强制删除(避免连接长期空闲失效)。
  • 若连接空闲时间 > minEvictableIdleTimeMillis,且当前空闲连接数 > minIdle:删除超出minIdle的部分(保留最小必要连接)。
  • 若连接空闲时间未达阈值,但testWhileIdle验证连接无效(如被数据库主动关闭):直接删除该连接。
  1. 连接池收缩触发回收
    当连接池检测到实际连接数远大于业务需求(如峰值过后),会主动收缩连接数,此时会优先删除空闲时间较长的连接(同样遵循上述阈值规则)。

三、使用被删除的空闲连接报错的原因及解决方案

报错原因

被删除的空闲连接通常已被Druid标记为“无效”并从连接池移除,但可能存在以下场景导致应用使用时报错:

  • 应用从连接池获取连接后,长时间未使用(超过空闲阈值),连接被Druid回收,但应用仍持有连接引用,使用时发现连接已关闭。
  • 数据库主动关闭了空闲连接(如数据库配置了wait_timeout,且小于Druid的maxEvictableIdleTimeMillis),导致Druid未及时检测到连接失效,应用获取后使用时报错(如“Connection closed”)。

解决方案

通过配置优化确保连接有效性,避免使用已失效的连接:

  1. 开启连接使用前的有效性检查
  • 配置testOnBorrow=true:从连接池获取连接时,执行validationQuery验证连接有效性(如SELECT 1)。若无效,会重试获取新连接(需配合maxWait设置超时)。
    缺点:每次获取连接都执行检查,会增加性能开销,建议仅在稳定性要求极高的场景使用。
  1. 强化空闲检查的有效性验证
  • 确保testWhileIdle=true(默认开启),并配置合理的validationQuery(如MySQL用SELECT 1,Oracle用SELECT 1 FROM DUAL)。
  • 调整timeBetweenEvictionRunsMillis:缩短检查间隔(如1分钟),让Druid更快发现并回收无效连接。
  1. 对齐Druid与数据库的空闲阈值
  • 确保Druid的maxEvictableIdleTimeMillis 小于数据库的wait_timeout(MySQL默认wait_timeout为8小时),避免数据库先于Druid关闭连接。
    例如:数据库wait_timeout=28800秒(8小时),则Druid可设置maxEvictableIdleTimeMillis=25200000毫秒(7小时)。
  1. 配置连接获取重试机制
  • 当获取连接失败时,通过代码或框架重试(如Spring的@Retryable),避免单次失败影响业务。
  1. 示例配置(优化后)
# 连接池配置
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=3
spring.datasource.druid.max-active=20# 空闲管理
spring.datasource.druid.time-between-eviction-runs-millis=60000  # 1分钟检查一次
spring.datasource.druid.min-evictable-idle-time-millis=300000     # 5分钟最小空闲
spring.datasource.druid.max-evictable-idle-time-millis=25200000  # 7小时最大空闲# 有效性检查
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.validation-query=SELECT 1
spring.datasource.druid.test-on-borrow=false  # 非必要不开启,减少开销
spring.datasource.druid.test-on-return=false

总结

Druid通过定期检查和空闲阈值控制管理空闲连接,删除时机取决于minEvictableIdleTimeMillismaxEvictableIdleTimeMillis等配置。若使用被删除的连接报错,核心是通过testWhileIdle强化空闲检查、对齐数据库超时配置、必要时开启testOnBorrow,确保应用获取的连接始终有效。

http://www.dtcms.com/a/329794.html

相关文章:

  • 光伏板横铺VS竖铺,布局决定发电量!
  • MySQL数据库知识体系总结 20250813
  • iOS混淆工具有哪些?数据安全与隐私合规下的防护实践
  • [ai]垂直agent|意图识别|槽位提取
  • 基于Tensorflow2.15的图像分类系统
  • MySQL三大存储引擎对比:InnoDB vs MyISAM vs MEMORY
  • 【Unity3D】Spine黑线(预乘问题)、贴图边缘裁剪问题
  • Effective C++ 条款39:明智而审慎地使用private继承
  • RabbitMQ:Windows版本安装部署
  • Java研学-RabbitMQ(六)
  • 基于js和html的点名应用
  • B站 韩顺平 笔记 (Day 17)
  • Spring Security 前后端分离场景下的会话并发管理
  • Spring Boot项目调用第三方接口的三种方式比较
  • 【Linux学习|黑马笔记|Day3】root用户、查看权限控制信息、chmod、chown、快捷键、软件安装、systemctl、软连接、日期与时区
  • Go 微服务限流与熔断最佳实践:滑动窗口、令牌桶与自适应阈值
  • NLP学习之Transformer(1)
  • 深度学习(4):数据加载器
  • Redis7学习——Redis的初认识
  • 51c自动驾驶~合集14
  • Docker:快速部署 Temporal 工作流引擎的技术指南
  • 3DM游戏运行库合集离线安装包下载, msvcp140.dll丢失等问题修复
  • 迅雷链接在线解密解析工具系统源码/本地化API/开源
  • 前缀函数的运用
  • Harmony OS 开发入门 第三章
  • Python Day29 CSS样式
  • Protobuf学习(1)—— 初识与安装
  • 代理解决跨域
  • SparseArray ArrayMap
  • Activity和Fragment生命周期