在 HikariPool 初始化的时候,已经知道负责链接建立的 addConnectionExecutor 这个线程池,那么只要找到向它提交任务的地方就能够了;ide
发现 HikariPool 实现了 IBagStateListener#addBagItem 接口,在里边执行了链接建立的动做spa
// 等待获取db链接的线程数
public void addBagItem(final int waiting)
{
final boolean shouldAdd = waiting - addConnectionQueueReadOnlyView.size() >= 0; // Yes, >= is intentional.
if (shouldAdd) {
addConnectionExecutor.submit(poolEntryCreator);
}
else {
logger.debug("{} - Add connection elided, waiting {}, queue {}", poolName, waiting, addConnectionQueueReadOnlyView.size());
}
}
再看哪里会调用 HikariPool#addBagItem, 找到 ConcurrentBag#borrow(timeout, timtUnit) 在从底层链接的容器申请db链接时,若是没有可用的 poolEntry,则会 调用 HikariPool#addBagItem 去提交新建db链接的任务;线程
因此在链接申请 HikariPool#getConnection() → concurrentBag#borrow 失败的话,也会触发链接的建立debug
HikariPool#addBagItem 和 HouseKeeper 的逻辑不同,addBagItem的场景是此刻db链接就不够用了,须要去建立接口