书接上文,异步创建连接需要设置参数,如果不设置参数,使用默认配置,会进到同步创建连接的分支。
if (createScheduler != null && asyncInit) {
// 异步
for (int i = 0; i < initialSize; ++i) {
submitCreateTask(true);
}
} else if (!asyncInit) {
// 同步
// init connections
while (poolingCount < initialSize) {
try {
PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection();
DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo);
connections[poolingCount++] = holder;
} catch (SQLException ex) {
LOG.error("init datasource error, url: " + this.getUrl(), ex);
if (initExceptionThrow) {
connectError = ex;
break;
} else {
Thread.sleep(3000);
}
}
}
if (poolingCount > 0) {
poolingPeak = poolingCount;
poolingPeakTime = System.currentTimeMillis();
}
}
可以看到,这里调用的跟异步调用的方法是同一个,即 createPhysicalConnection()。
因为同步方式就是单线程顺序执行,while 循环中创建出初始化连接数量的连接,封装到 DruidConnectionHolder 中,并保存到数组中,相比较异步初始化多线程的情况,要简单很多。
// 由此行代码可知 poolingCount 表示连接池数量
connections[poolingCount++] = holder;