druid初始化过程

mac2024-03-17  25

durid 初始化过程

init方法

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();//销毁链接的线程

初始化完成

最新回复(0)