// 连接池瘦身,参考主流程4
public class DestroyConnectionThread extends Thread {
public DestroyConnectionThread(String name) {
// 给线程重命名
super(name);
// 标记为守护线程
this.setDaemon(true);
}
// run 方法
public void run() {
// 通知 init(主流程2)自己已经启动成功
initedLatch.countDown();
// 死循环
for (;;) {
// 从前面开始删除
try {
if (closed || closing) {
break;
}
// 检查时间间隔,缺省值是 60s
if (timeBetweenEvictionRunsMillis > 0) {
Thread.sleep(timeBetweenEvictionRunsMillis);
} else {
// 小于 0 时则是 1s
Thread.sleep(1000);
}
if (Thread.interrupted()) {
break;
}
// 启动 destroy 的 run 方法(在下方)
destroyTask.run();
} catch (InterruptedException e) {
break;
}
}
}
}
// DruidDataSource 内部类
public class DestroyTask implements Runnable {
public DestroyTask() {
}
@Override
public void run() {
// 连接池的检查&瘦身
shrink(true, keepAlive);
// 如果开启该属性,则进行强制回收检查
if (isRemoveAbandoned()) {
removeAbandoned();
}
}
}