当前位置: 首页 > 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.lryc.cn/news/619954.html

相关文章:

  • TeamViewer 以数字化之力,赋能零售企业效率与客户体验双提升
  • “我店模式”:零售转型中的场景化突围
  • 【k8s】k8s pod调度失败原因列表、Pod 完整的状态类型列表
  • TDengine IDMP 基本功能(4. 实时分析)
  • 【金仓数据库产品体验官】_从实践看金仓数据库与 MySQL 的兼容性
  • Java开发主流框架搭配详解及学习路线指南
  • Pytest项目_day14(参数化、数据驱动)
  • VR中image或者文字一直浮现在眼前
  • Flutter 多模块 + 组件化架构设计实践
  • 使用HtmlAgilityPack+PuppeteerSharp+iText7抓取Selenium帮助文档
  • PCIE 配置空间 拓展能力 定义
  • mac环境下安装git并配置密钥等
  • 20250813测试开发岗(凉)面
  • 19. 重载的方法能否根据返回值类型进行区分
  • 完整源码+技术文档!基于Hadoop+Spark的鲍鱼生理特征大数据分析系统免费分享
  • Java Spring框架最新版本及发展史详解(截至2025年8月)-优雅草卓伊凡
  • 【C#】利用数组实现大数数据结构
  • 云电竞盒子对游戏性能有影响吗?
  • 《Python学习之基础语法1:从零开始的编程之旅》
  • 向量相似度计算与Softmax概率分布对比
  • 2025盛夏AI热浪:八大技术浪潮重构数字未来
  • String里常用的方法
  • el-table合并相同名称的列
  • java中在多线程的情况下安全的修改list
  • 基于C#、.net、asp.net的心理健康咨询系统设计与实现/心理辅导系统设计与实现
  • LCP 17. 速算机器人
  • 老生常谈智能指针:《More Effective C++》的条款28
  • Linux 服务:动态主机配置协议(DHCP)实战指南 —— 服务器部署与跨网段配置
  • 4.0 vue3简介
  • DAY 44 预训练模型