druid产生大量mysql的sleep连接

导读:本篇文章讲解 druid产生大量mysql的sleep连接,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

前言

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

druid配置

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

druid产生大量mysql的sleep连接

编辑切换为居中

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



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

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

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

druid产生大量mysql的sleep连接

 

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

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

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

druid产生大量mysql的sleep连接

 

mysql状态

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

druid产生大量mysql的sleep连接

编辑切换为居中

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

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

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

druid产生大量mysql的sleep连接

 

依据本地的配置,可以判断出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之水平分库和读写分离(二)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/94678.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!