mysqltestwhileidle_Druid配置参数详解-testWhileIdle
Druid配置参数详解-testWhileIdle
Druid是⼀个由阿⾥开源的数据库连接池,Druid的配置⾮常丰富,但是设置不当会对⽣产环境造成严重影响,⽹上Druid的资料虽多,但⼤部分都是互相复制粘贴,有很多不准确甚⾄完全错误的描述,Druid已经开源很久,⽽且作者WenShao的⼯作重⼼也已经不在Druid上,有些功能估计他⾃⼰都不太了解了。本系列将从源代码的⾓度分析Druid⽬前的最新版本(1.1.21)各个常⽤的配置项的具体含义以及是怎么起作⽤的。
画外⾳:⽬前Druid在开源中国举办的2019年度最受欢迎中国开源软件中排名第7名,⽀持Druid的朋友可以去投票哇。2019年度最受欢迎中国开源软件
testWhileIdle是什么意思?
testWhileIdle:如果为true(默认true),当应⽤向连接池申请连接,并且testOnBorrow为false时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可⽤。
testWhileIdle什么时候会起作⽤?
获取连接时;
testOnBorrow==false;
testWhileIdle==true;
使⽤代码在DruidDataSource的getConnectionDirect⽅法
注意:此时判断连接空闲的依据是空闲时间⼤于timeBetweenEvictionRunsMillis(默认1分钟),并不是使⽤minEvictableIdleTimeMillis 跟maxEvictableIdleTimeMillis,也就是说如果连接空闲时间超过⼀分钟就测试⼀下连接的有效性,但并不是直接剔除;⽽如果空闲时间超过了minEvictableIdleTimeMillis则会直接剔除。
if (testOnBorrow) {
boolean validate = testConnectionInternal(poolableConnection.holder, );
if (!validate) {
if (LOG.isDebugEnabled()) {
LOG.debug("skip not validate connection.");
}
discardConnection(poolableConnection.holder);
continue;
}
} else {
if (isClosed()) {
discardConnection(poolableConnection.holder); // 传⼊null,避免重复关闭
continue;
}
if (testWhileIdle) {
druid连接池配置详解final DruidConnectionHolder holder = poolableConnection.holder;
long currentTimeMillis = System.currentTimeMillis();
long lastActiveTimeMillis = holder.lastActiveTimeMillis;
long lastExecTimeMillis = holder.lastExecTimeMillis;
long lastKeepTimeMillis = holder.lastKeepTimeMillis;
if (checkExecuteTime
&& lastExecTimeMillis != lastActiveTimeMillis) {
lastActiveTimeMillis = lastExecTimeMillis;
}
if (lastKeepTimeMillis > lastActiveTimeMillis) {
lastActiveTimeMillis = lastKeepTimeMillis;
}
long idleMillis = currentTimeMillis - lastActiveTimeMillis;
long timeBetweenEvictionRunsMillis = this.timeBetweenEvictionRunsMillis;
if (timeBetweenEvictionRunsMillis <= 0) {
timeBetweenEvictionRunsMillis = DEFAULT_TIME_BETWEEN_EVICTION_RUNS_MILLIS;
}
if (idleMillis >= timeBetweenEvictionRunsMillis
|| idleMillis < 0 // unexcepted branch
) {
boolean validate = testConnectionInternal(poolableConnection.holder, );
if (!validate) {
if (LOG.isDebugEnabled()) {
LOG.debug("skip not validate connection.");
}
discardConnection(poolableConnection.holder);
continue;
}
}
}
}
连接池是如何判断连接是否有效的?
总结
testWhileIdle的作⽤跟testOnBorrow是差不多的,都是在获取连接的时候测试连接的有效性,如果两者都为true,则testOnBorrow优先级⾼,则不会使⽤到testWhileIdle。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论