代码执行流程
DruidDataSource.init(){
DruidDataSource.createAndLogThread()
DruidDataSource.createAndStartCreatorThread()
DruidDataSource.createAndStartDestroyThread()
DruidDataSource.DestroyConnectionThread.run() {
com.alibaba.druid.pool.DruidDataSource.DestroyTask.run() {
com.alibaba.druid.pool.DruidDataSource.shrink(boolean checkTime, boolean keepAlive){}
}
}}
复制代码
以上为伪代码
下面为内部类 DestroyConnectionThread
public class DestroyConnectionThread extends Thread {
public DestroyConnectionThread(String name){ super(name); this.setDaemon(true); }
public void run() { initedLatch.countDown();
for (;;) { // 从前面开始删除 try { if (closed || closing) { break; }
if (timeBetweenEvictionRunsMillis > 0) { Thread.sleep(timeBetweenEvictionRunsMillis); } else { Thread.sleep(1000); // }
if (Thread.interrupted()) { break; }
destroyTask.run(); } catch (InterruptedException e) { break; } } }
}
复制代码
Druid-ConnectionPool-Destroy 守护线进行无限循环,每次循环中进行 sleep。 Druid-ConnectionPool-Destroy 守护线程每次循环都会调用 DestroyTask.run(),DestroyTask.run()调用 com.alibaba.druid.pool.DruidDataSource.shrink(boolean checkTime, boolean keepAlive) 执行 druid 保活逻辑。
评论