本文主要介绍连接池初始化的过程。
目录
连接池初始化
在文章《druid解析-DruidDataSource初始化》中,我们看到在DruidDataSource初始化的过程中,创建了连接对象,本文我们详细介绍初始化过程。
下面的代码是DruidDataSource.init()方法中创建初始化连接池的代码:
if (createScheduler != null && asyncInit) {
//使用定时线程创建initialSize个连接对象
for (int i = 0; i < initialSize; ++i) {
submitCreateTask(true);
}
} else if (!asyncInit) {
// init connections
//如果设置非异步初始化,则直接创建连接对象
//poolingCount表示连接池中连接对象的个数
while (poolingCount < initialSize) {
try {
//调用Driver.connect()方法创建数据库连接
//并对连接对象初始化,比如设置隔离级别,设置是否自动提交
//如果设置了connectionInitSqls属性,那么创建出来的连接对象还会执行connectionInitSqls设置的SQL语句
//如果设置initVariants和initGlobalVariants为true,该连接对象还会调用数据库获取数据库参数,既包括会话参数,也包括全局参数,并保存到Map对象中
//如果设置了validationQuery,会执行该SQL语句检查连接对象是否ok
//该连接对象还会使用ValidConnectionChecker对连接对象检查
PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection();
DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo);
//connections数组就是连接池,将创建好的连接对象保存到连接池中
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(