第一次初始化
1、创建一个数组
connections = new DruidConnectionHolder[maxActive]
2、当连接池的连接数小于初始值,生成真正的数据库连接;
poolingCount是数据连接池里的参数,当前可用连接数数?
while (poolingCount < initialSize) {
PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection();
DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo);
connections[poolingCount++] = holder;
}
3、校验连接,获取连接时,如果校验连接失效,循环获取下一个连接
result = validConnectionChecker.isValidConnection(conn, validationQuery, validationQueryTimeout);
4、线程启动 create和destroy
this.createAndLogThread();
this.createAndStartCreatorThread();
this.createAndStartDestroyThread();
下列情况不会创建线程:
if (emptyWait) {
// 必须存在线程等待,才创建连接(连接池里有线程,就不用创建了)
if (poolingCount >= notEmptyWaitThreadCount //
&& !(keepAlive && activeCount + poolingCount < minIdle)) {
empty.await();
}
// 防止创建超过maxActive数量的连接(活跃的数量+连接池中的数量)
if (activeCount + poolingCount >= maxActive) {
empty.await();
continue;
}
}
获取连接
1、connectCount +1 poolingCount -1
然后获取连接 ;activeCount +1 (使用中的连接数)
decrementPoolingCount();
Drui