文章目录
一、DruidAbstractDataSource
protected ReentrantLock lock;
protected Condition notEmpty;
protected Condition empty;
// DruidDataSource 构造函数会调用下面的方法
public DruidAbstractDataSource(boolean lockFair){
lock = new ReentrantLock(lockFair);
notEmpty = lock.newCondition();
empty = lock.newCondition();
}
二、DruidDataSource
DruidDataSource 类的继承关系
DruidDataSource
的构造方法
public DruidDataSource(){
this(false);
}
// fairLock 是否是公平锁
public DruidDataSource(boolean fairLock){
// 调用 DruidAbstractDataSource 构造函数
super(fairLock);
// 通过读取配置设置参数
configFromPropety(System.getProperties());
}
DruidDataSource.getConnection()
获取到连接
@Override
public DruidPooledConnection getConnection() throws SQLException {
return getConnection(maxWait);
}
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
// 初始化
init();
if (filters.size() > 0) {
// 如果存在过滤器,则通过责任链模式调用所有filter
FilterChainImpl filterChain = new FilterChainImpl(this);
return filterChain.dataSource_connect(this, maxWaitMillis);
} else {
// 这里面有很多细节,主要就是返回一个DruidPooledConnection对象
return getConnectionDirect(maxWaitMillis);
}
}
init 初始化方法
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;