Druid-代码段-1-2
本代码段对应流程1.1,责任链的执行:
//DruidDataSource类里的方法:获取连接
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
init();
if (filters.size() > 0) { //责任链上的filter存在
FilterChainImpl filterChain = new FilterChainImpl(this); //该类是执行整个责任链的执行者
return filterChain.dataSource_connect(this, maxWaitMillis); //每个需要执行责任链的方法,在filterChain里都可以找到映射方法,比如本方法getConnection,就对应filterChain.dataSource_connect(参考流程1.1)
} else {
return getConnectionDirect(maxWaitMillis);
}
}
//FilterChainImpl类里的方法:获取连接映射方法
@Override
public DruidPooledConnection dataSource_connect(DruidDataSource dataSource, long maxWaitMillis) throws SQLException {
if (this.pos < filterSize) {
//除了FilterChainImpl里面包含一些datasource的映射方法,需要执行的filter里面也包括,比如下面的dataSource_getConnection方法
DruidPooledConnection conn = nextFilter().dataSource_getConnection(this, dataSource, maxWaitMillis); //根据下标,获取下一个filter,触发目标方法
return conn;
}
return dataSource.getConnectionDirect(maxWaitMillis); //执行到最后一个filter时,触发datasource,返回真正的连接
}
//FilterChainImpl类里的方法:获取下一个需要执行的filter
private Filter nextFilter() {
return getFilters()
.get(pos++); //根据游标计算
}
//随便找了一个filter里的目标方法
//LogFilter类里的方法:dataSource_getConnection
@Override
public DruidPooledConnection dataSource_getConnection(FilterChain chain, DruidDataSource dataSource,
long maxWaitMillis) throws SQLException {
DruidPooledConnection conn = chain.dataSource_connect(dataSource, maxWaitMillis); //这里又会利用FilterChainImpl触发映射方法
//下面就是自己内部的一些特有逻辑,忽略
ConnectionProxy connection = (ConnectionProxy) conn.getConnectionHolder().getConnection();
if (connectionConnectAfterLogEnable && isConnectionLogEnabled()) {
connectionLog("{conn-" + connection.getId() + "} pool-connect");
}
return conn; //返回
}