durid 初始化过程
init方法
- 判断是否已经初始化过了
- 初始化DruidDriver 单例模式
- 获得线程锁,当被打断时,停止尝试获取锁
- 获取锁成功后,再判断实例是否已经初始化过了
- 创建数据源id,同时累计加1
- 判断是不是wrap-jdbc如果是则初始化,同时加载过滤
- 初始化过滤器filter
- 设置数据库类型dbtype,对于mysql\mariadb\aliyun_ads三个数据库,判断是否使用(cacheSeverConfiguration)数据库缓存
- autoFilterLoader加载
- 识别数据库类型,if 连续判断
- Mysql和Oracle两大类判断
- 加载链接心跳检测模块
- validationQueryCheck()没有看明白
if (isUseGlobalDataSourceStat()) {
dataSourceStat = JdbcDataSourceStat.getGlobal();
if (dataSourceStat == null) {
dataSourceStat = new JdbcDataSourceStat("Global", "Global", this.dbType);
JdbcDataSourceStat.setGlobal(dataSourceStat);
}
if (dataSourceStat.getDbType() == null) {
dataSourceStat.setDbType(this.dbType);
}
} else {
dataSourceStat = new JdbcDataSourceStat(this.name, this.jdbcUrl, this.dbType, this.connectProperties);
}
dataSourceStat.setResetStatEnable(this.resetStatEnable);
这一段没有看懂
connections = new DruidConnectionHolder[maxActive];
evictConnections = new DruidConnectionHolder[maxActive];
keepAliveConnections = new DruidConnectionHolder[maxActive];
初始化三类不同的链接管理器
for (int i = 0; i < initialSize; ++i) {
submitCreateTask(true);
}
异步初始化链接任务
private void submitCreateTask(boolean initTask) {
createTaskCount++;//应该是记录了执行的次数
CreateConnectionTask task = new CreateConnectionTask(initTask); //创建了一个链接任务
if (createTasks == null) {
createTasks = new long[8];
}
boolean putted = false;
//把当前任务的taskId加入到createTasks的第一个为零的元素中,记录,没有使用集合框架
for (int i = 0; i < createTasks.length; ++i) {
if (createTasks[i] == 0) {
createTasks[i] = task.taskId;
putted = true;
break;
}
}
//如果容量不足的时候,扩充至原来的1.5倍
if (!putted) {
long[] array = new long[createTasks.length * 3 / 2];
System.arraycopy(createTasks, 0, array, 0, createTasks.length);
array[createTasks.length] = task.taskId;
createTasks = array;
}
//提交任务,还不知道createScheduler的实现类是哪个
this.createSchedulerFuture = createScheduler.submit(task);
}
createAndLogThread();//日志线程
createAndStartCreatorThread();//创建链接的线程
createAndStartDestroyThread();//销毁链接的线程
初始化完成