目录
今天就连着昨天的思路,来看下连接到底是如何初始化的。
第14步: 初始化连接,数量为设置的初始连接数,并存放到数组中;(真正创建连接在这一步中)
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();
}
}
1. 异步参数
异步初始化需要设置2个参数:
ScheduledExecutorService createScheduler 和 boolean asyncInit = false;
public void setCreateScheduler(ScheduledExecutorService createScheduler) {
// 已经初始化之后再设置抛出异常
if (isInited()) {
throw new DruidRuntimeException("dataSource inited.");
}
this.createScheduler = createScheduler;
}
在 DruidDataSource 构造方法中,会从系统的环境变量中取值设置;
或者手动调用 Setter 设置。
public DruidDataSource(boolean fairLock){

本文详细解析了DruidDataSource的异步参数设置、创建连接任务的执行流程,以及连接初始化过程中的并发控制。重点在于理解连接池的异步创建策略和线程安全措施。
最低0.47元/天 解锁文章
1403

被折叠的 条评论
为什么被折叠?



