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状态的连接。
如果此时再次重新要求,该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之水平分库和读写分离(二)