testOnBorrow | 申请连接时执行validationQuery 配置的探活语句检测连接是否有效。 |
testWhileIdle | 申请连接的时候检测,如果空闲时间于timeBetweenEvictionRunsMillis ,执 validationQuery 检测连接是否有效 |
testOnReturn | 归还连接时执 validationQuery 检测连接是否有效。 |
timeBetweenEvictionRunsMillis | testWhileIdle 的判断依据 |
testOnBorrow 和 testWhileIdle
com.alibaba.druid.pool.DruidDataSource#getConnectionDirect
// 获取连接时检测连接有效性
if (testOnBorrow) {
// 连接检测
boolean validate = testConnectionInternal(poolableConnection.holder, poolableConnection.conn);
if (!validate) {
if (LOG.isDebugEnabled()) {
LOG.debug("skip not validate connection.");
}
discardConnection(poolableConnection.holder);
continue;
}
} else {
// 因为没有做连接检测,需要判断一下
if (poolableConnection.conn.isClosed()) {
discardConnection(poolableConnection.holder); // 传入null,避免重复关闭
continue;
}
// testOnBorrow为false 是testWhileIdle的前提
if (testWhileIdle) {
final DruidConnectionHolder holder = poolableConnection.holder;
// 当前时间
long currentTimeMillis = System.currentTimeMillis();
// 上一次连接活跃时间
long lastActiveTimeMillis = holder.lastActiveTimeMillis;