问题:
我们线上配置的具体配置 minIdle=20,详情见附件1
druid日志打印出来 activeCount+poolingCount=4 具体日志见附件2.
连接池的总量已经低于最小值了。
出现这种原因:
业务从连接池获取连接后,testWhileIdle,发现连接失败(注:超过服务端空闲时间,已经被数据库服务端强行关闭,目前我们的运维体系里,服务端关闭被强行定义为15分钟)此时抛弃该连接,数量从初始值的20变为19.后面反复会陆续降低到业务真正使用的连接数,我们的业务上是4个。
进一步分析:
对于震荡式业务, 如果业务对连接数需求新增,会新建连接,连接池数量从4个增加到6个(在我们的业务场景下),然后业务需求降低,会有几个连接一直不被使用(连接池数据结构使用的数组堆栈),最终等到业务震荡高峰时被获取,如果刚好超过了minEvictableIdleTimeMillis并且已经被服务端关闭,testWhileIdle后被丢弃。
这个会导致连接池的意义被降低了,极端情况,对震荡式的业务会导致获取连接时会遇到 1.先testWhileIdle 2.再await等待CreateConnectionThread线程新建连接
代码分析和个人想法:
目前的CreateConnectionThread线程用于新建扩充,DestroyConnectionThread用于收缩:
看了源代码,我们是用的1.0.8 http://grepcode.com/file/repo1.maven.org/maven2/com.alibaba/dr