druid产生大量mysql的sleep连接

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

前言

在使用druid连接池后,show full processlist 后发现有大量sleep状态的链接,高峰期时达到1000多个,项目框架用的springmvc+mybatis,由spring管理的链接在每次数据库操作后应该是释放连接的,排除是代码泄露连接的可能性。

druid配置

然后看了下线上项目中druid的配置信息

编辑切换为居中

添加图片注释,不超过 140 字(可选)

 
 

minIdle=30, 最小连接池数量是30个, maxActive=300,最大并发数是300, minEvictableIdleTimeMillis=300000 连接在池中最小生存的时间是300秒 timeBetweenEvictionRunsMillis=120000检测需要关闭的空闲连接,是120秒。

看这个配置,原来的理解是一个德鲁伊连接池内最多有300个连接,空闲超过120秒的链接会由德鲁伊去关闭。

然后在本地的项目中,将相应的参数改小,起了100个线程去访问数据库,每个线程中的事务中sleep 3秒,

 

上面的配置为:最小连接数10,最大连接并发是20个,隔5秒去检测关闭空闲连接。

预期应该是20个连接瞬间跑满,剩余的请求会在上面的20个连接释放后继续访问数据库。

根据日志可以看出每隔3秒会执行20次数据库的访问。

 

mysql状态

在数据库中通过 show full processlist查看发现一直是20个连接,所有查询执行完后,会有20个sleep状态的连接。

编辑切换为居中

添加图片注释,不超过 140 字(可选)

如果此时再次重新请求,该20个连接会再次唤醒,执行完后处于sleep状态。

再等待10几秒后,再执行show full processlist后会发现只剩下10个sleep状态的连接了,然后这10个连接会一直sleep,mysql 默认的等待超时时间是8个小时,8个小时后这些连接会再次被回收。

 

依据本地的配置,可以判断出druid中

  • minIdle=10:最小连接池数量是10个,是不会被关闭,是一直存活在连接池中,没有调用的话就一直sleep。

  • maxActive=20:最大并发数是20个,超过20个连接请求则会等待,如果等待时长大于maxWait的时间则会报错。

  • minEvictableIdleTimeMillis=10000,所有的新创建的连接在连接池中最小的存存活时间是10秒,然后每隔5秒会检测一次是否有存活超过10秒的连接。有的话就会关闭该连接。

结合线上项目部署了10台服务器,每台服务器的最小连接数是30,如果连的是同一个数据库的话,则连接池中会一直存在300个连接。

如果某个高峰时间段,每台连接数都跑满,则数据库中每个连接sleep的时间是(300+120)秒的时间,如果在这300到420秒的时间段内,请求很频繁的话,数据库中的连接数短期内是不会降下来的。

总结

结合以上情况修改方案:

1、读写分离,将读的操作都分担到从库中去,减少主库的压力。

2、修改 minEvictableIdleTimeMillis 和timeBetweenEvictionRunsMillis的值,减少存活时间和检测时间。

但如果请求的很频繁的话,数据库会频繁的关闭和创建连接,同样消耗资源。

3、修改mysql的等待超时时间,set global wait_timeout=28800; 默认的是8小时。


推荐阅读

MySQL死锁产生的原因和解决方法

解决Api统一格式返回,遗留地返回String一个问题

SpringMVC全局异常方案、源码分析,以及常见的入坑

Spring多种启动初始化方案,看这篇就够了

来说说ThreadLocal内存溢出问题

阿里面试题:强、软、弱、虚引用的特点及应用场景

企业常用的并发编程Queue的源码分析

了解JAVA中的SPI机制,以及数据库驱动插件,这一篇就够了

企业实战之阿里druid统一监控方案,你了解吗?

千人千面精准推荐之大白话讲解协同算法(一),看这篇就够了

企业实战之分布式锁方案一步步的演变

你了解滑动时间窗口吗?Sentinel核心源码剖析

Sentinel全局Feign默认熔断降级策略的思考

你所不知道的头部参数传递的坑,来吧!抓紧出坑

5分钟让你理解K8S必备架构概念,以及网络模型(一)

5分钟让你理解K8S必备架构概念,以及网络模型(二)

5分钟让你理解K8S必备架构概念,以及网络模型(三)

大厂如何基于binlog解决多机房同步mysql数据(一)?

大厂如何基于binlog解决多机房同步mysql数据(二)?

基于binlog的canal组件有哪些使用场景(三)?

基于binlog日志之canal企业应用及高可用原理(四)?

可用于大型应用的微服务生态灰度发布如何实现?

一线大厂级别公共Redis集群监控,细化到每个项目实例

Sharding-jdbc的实战入门之水平分表(一)

Sharding-Jdbc之水平分库和读写分离(二)

第一百期:Java架构师:高并发下的流量控制 这个时候如果不做任何保护措施,服务器就会承受很大的处理压力,请求量很高,服务器负载也很高,并且当请求超过服务器承载极限的时候,系统就会崩溃,导致所有人都不能访问。 作者:IT技术分享 这个时候如果不做任何保护措施,服务器就会承受很大的处理压力,请求量很高,服务器负载也很高,并且当请求超过服务器承载极限的时候,系统就会崩溃,导致所有人都不能访问。 为了应用服务的高可用,一个常用的办法是对大... 阅读详情

相关推荐

记录一次driud连接池的连接数用完问题

druid连接池的活跃连接达到最大连接

dhklsl的专栏 2861

mysqlshow full processlist状态详解

Copying to tmp table [on disk]: 线程正在执行查询,并且将结果集都复制到另一个临时表中,这种状态一般是要么在做group by 操作,要么是文件排序或者是union操作。Copying to tmp table: 表示当前连接正在将数据复制到临时表中,通常发生在 GROUP BY 或 ORDER BY 等操作执行时。Repair by sorting: 表示当前连接正在对表进行排序,以修复表中的数据。Analyzing: 表示当前连接正在分析查询,以确定最佳查询计划。

Artisan_w 1802

layui 监听单元格点击事件,获取当前点击单元格的内容以及 所在的表头内容

特别是后台的一些管理系统中 业务中还是会碰见这样的需求呢 如果你的后台使用layui写的话 在表格中 layui 也给我们提供了监听单元格的事件 但是好像不能直接获取到单元格内容个 和 对应的表头 其实 还是可以解决 换个角度使劲就会发现新的世界 不是吗 event: 'username' 在每个表头中加一个 event 属性 这样就可以监听表头事件 记住个 event 和 当前列的字段最好保持一样 table.render({ e...

业余前端的职业经历 1万+

show full processlist;命令详解 - MySQL

mysqlshow processlist 详解 最近排查一些MySQL的问题,会经常用到 show processlist,所以在这里把这个命令总结一下,做个备忘,以备不时只需。 首先是几条常用的SQL。 1、按客户端 IP 分组,看哪个客户端的链接数最多 selectclient_ip,count(client_ip)asclient_numfrom(selects...

SAGGITARXM 6846

show processlist说明

mysql> show processlist; 有时候输出太多,可以用下面的语句代替 mysql> select * from information_schema.processlist where command <> 'Sleep'; mysql>select * from information_schema.processlist...

aohexi1719的博客 394

MySQLSleep进程占用大量连接解决方法

第一部分为产生大量sleep进程的原理及对应解决方法第二部分为设置wait_timeout值,有效减少sleep进程 ==========================================第一部分开始 1、通常来说,MySQL出现大量Sleep进程是因为采用的PHP的MySQL长链接数据库方式,即使用了mysql_pconnect来打开链接数据库,解决办法就是使用“短”链接,即m...

weixin_30701521的博客 111

微服务 mysql 连接池_微服务架构下,MySQL读写分离后,Druid连接池参数优化实战...

前言最近利用MHA做好Mysql读写分离后,时不时有用户反馈后台发布文章时,报程序“通用异常",经问题排查,里面涉及应用JDBC连接池参数及Mysql参数调整问题。问题回顾异常日志描述:从异常信息反映来看,问题关键有两点数据库连接池超时设置大于wait_timeout日志提示,可以通过验证数据库连接或者设置:autoReconnect=true 来避免此异常从以上两点可以推测第一、应用程序数据库连...

weixin_36285392的博客 270

微服务mysql连接池设置_微服务架构下,MySQL读写分离后,Druid连接池参数优化实战...

最近利用MHA做好Mysql读写分离后,时不时有用户反馈后台发布文章时,报程序“通用异常”,经问题排查,里面涉及应用JDBC连接池参数及Mysql参数调整问题。问题回顾异常日志描述:从异常信息反映来看,问题关键有两点数据库连接池超时设置大于wait_timeout日志提示,可以通过验证数据库连接或者设置:autoReconnect=true 来避免此异常从以上两点可以推测第一、应用程序数据库连接池...

weixin_32652003的博客 338

MySQL Sleep进程过多:诊断、优化与根治方案

数据库连接管理是后端系统性能优化的核心环节,其原理在于通过连接池复用TCP连接,减少频繁建立和销毁的开销。合理配置连接池能显著提升系统吞吐量和响应速度,技术价值体现在资源利用率和系统稳定性上。在Web应用、微服务等高频数据库访问场景中,连接泄漏或配置不当会导致大量空闲连接堆积,表现为MySQLSleep进程过多,进而引发'Too many connections'错误。本文聚焦连接池配置与wait_timeout参数调优,提供从监控诊断到代码修复的完整解决方案,帮助开发者根治这一常见性能瓶颈。

weixin_31742871的博客 268

用 MHA 做 MySQL 读写分离,频繁爆发线上生产事故后,泪奔分享 Druid 连接池参数优化实战...

点击上方蓝色“架构荟萃”关注我们,输入1024,你懂的前言最近利用 MHA 做好 Mysql 读写分离后,时不时有用户反馈后台发布文章时,报程序“通用异常",经问题排查,里面涉及...

321

连接数据库超时_用 MHA 做 MySQL 读写分离,频繁爆发线上生产事故后,泪奔分享 Druid 连接池参数优化实战...

点击上方IT牧场,选择置顶或者星标技术干货每日送达前言最近利用 MHA 做好 Mysql 读写分离后,时不时有用户反馈后台发布文章时,报程序“通用异常",经问题排查,里面涉及应用JDBC连接池参数及Mysql参数调整问题。问题回顾异常日志描述:从异常信息反映来看,问题关键有两点数据库连接池超时设置大于wait_timeout日志提示,可以通过验证数据库连接或者设置:autoReco...

weixin_42413377的博客 196

用 MHA 做 MySQL 读写分离,频繁爆发线上生产事故后,泪奔分享 Druid 连接池参数优化实战

点击上方“猿芯”,选择“设为星标”后台回复"1024",有份惊喜送给面试的你前言最近利用 MHA 做好 Mysql 读写分离后,时不时有用户反馈后台发布文章时,报程序“通用...

408

MySQL连接超时深度解析:从wait_timeout原理到连接池协同配置实战

数据库连接管理中,连接超时是一个基础且关键的技术概念。其核心原理在于数据库服务器通过超时机制自动回收空闲连接以释放系统资源,防止连接泄漏。这一机制的技术价值在于保障数据库服务的稳定性和资源利用率,尤其在微服务和高并发架构下至关重要。典型的应用场景包括Web应用后台服务、云原生部署等,其中连接池与数据库服务器的超时协同配置是工程实践的重点。本文围绕MySQL的wait_timeout与interactive_timeout参数,结合连接池配置和线上案例,深入探讨如何通过调整超时时间解决Communicati

weixin_34032792的博客 422

连接池超时配置_Mysql数据库读写分离,应用层Druid连接池参数优化实战

欢迎关注我的头条号:Wooola,10年Java软件开发及架构设计经验,专注于Java、Go语言、微服务架构,致力于每天分享原创文章、快乐编码和开源技术。前言最近利用MHA做好Mysql读写分离后,时不时有用户反馈后台发布文章时,报程序“通用异常",经问题排查,里面涉及应用JDBC连接池参数及Mysql参数调整问题。问题回顾异常日志描述:从异常信息反映来看,问题关键有两点数据库连接池超时设置大于w...

weixin_32154109的博客 799

MYSQLMYSQL学习的一大重点:MySQL连接池原理与分析简易网站数据流动是如何进行

🎬 艾莉丝的简介:传统数据库连接模式下,每次执行 SQL 都会执行完整的生命周期:核心弊端:该模型是 C/C++ 生态最常用的连接池实现方案,核心逻辑为一个工作线程绑定一个数据库连接,基于线程池实现任务调度。以下为 C++ 调用 MySQL C API 的基础连接实现,是连接池单线程的核心逻辑原型: 1.4 完整 C++ MySQL 连接池工程实现 1.4.1 核心设计约束 线程与连接一一绑定,连接生命周期与线程生命周期完全一致,符合 MySQL 连接非线程安全的底层约束 基于生产者 - 消费者模型,

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 3672
上一篇: MySQL死锁产生的原因和解决方法
下一篇: 高效开发:你的项目有接口聚合服务吗?
java小姜在线冲
博客等级 码龄4年 51粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值