1、含义
官方解释:连接池中的 minIdle 数量以内的连接,空闲时间超过 minEvictableIdleTimeMillis,则会执行 keepAlive 操作。默认为 false。
说的不是很清楚,初步看起来这个参数会在合适的时候检查连接,保证连接是有效的。
2、源码
可以通过 DruidDataSource.setKeepAlive(true)开启该参数,查看源码,搜索 keepAlive,除了在创建连接时进行判断,主要在 shrink 这个方法中使用。这个方法是在 DestroyTask 线程中,判断连接是否需要被回用的。keepAlive 使用到的代码如下:
if (keepAlive && idleMillis >= keepAliveBetweenTimeMillis) {
keepAliveConnections[keepAliveCount++] = connection;
}
复制代码
将空闲时间超过设置的 keepAliveBetweenTimeMillis 参数的连接放入到待检测的池子中。
if (keepAlive && poolingCount + activeCount < minIdle) {
needFill = true;
}
复制代码
开启该参数并且现有连接小于 minIdle,需要新建连接。
for (int i = keepAliveCount - 1; i >= 0; --i) {
DruidConnectionHolder holer = keepAliveConnections[i];
Connection connection = holer.getConnection();
holer.incrementKeepAliveCheckCount();
boolean validate = false;
try {
this.validateConnection(connection);
validate = true;
} catch (Throwable error) {
if (LOG.isDebugEnabled()) {
LOG.debug("keepAliveErr", error);
}
// skip
}
boolean discard = !validate;
if (validate) {
holer.lastKeepTimeMillis = System.currentTimeMillis();
boolean putOk = put(holer, 0L, true);
if (!putOk) {
discard = true;
}
}
if (discard) {
try {
connection.close();
} catch (Exception e) {
// skip
}
lock.lock();
try {
discardCount++;
if (activeCount + poolingCount <= minIdle) {
emptySignal();
}
} finally {
lock.unlock();
}
}
}
复制代码
检查连接可用性,不可用就丢弃。
评论