Alibaba Druid 源码阅读(三) 数据库连接池初始化探索
简介
上文中探索了Alibaba Druid的连接池初始化和获取连接的关键代码,接下来详细看看初始化部分
数据库连接池初始化
对整个代码加上注释,如下:
public void init() throws SQLException {
// 已经初始化过了,直接返回
if (inited) {
return;
}
// bug fixed for dead lock, for issue #2980
DruidDriver.getInstance();
// 初始化时上锁
final ReentrantLock lock = this.lock;
try {
lock.lockInterruptibly();
} catch (InterruptedException e) {
throw new SQLException("interrupt", e);
}
boolean init = false;
try {
if (inited) {
return;
}
initStackTrace = Utils.toString(Thread.currentThread().getStackTrace());
// 这部分尚不清楚作用
this.id = DruidDriver.createDataSourceId();
if (this.id > 1) {
long delta = (this.id - 1) * 100000;
this.connectionIdSeedUpdater.addAndGet(this, delta);
this.statementIdSeedUpdater.addAndGet(this, delta);
this.resultSetIdSeedUpdater.addAndGet(this, delta);
this.transactionIdSeedUpdater.addAndGet(this, delta);
}
// 数据库连接url
if (this.jdbcUrl != null) {
this.jdbcUrl = this.jdbcUrl.trim();
initFromWrapDriverUrl();
}
// filter相关,目前为空
for (Filter filter : filters) {
filter.init(this