分析DataSource中的方法getConnection( )
@Override
public DruidPooledConnection getConnection() throws SQLException {
/**
* 实现DataSource接口的getConnection方法
*/
return getConnection(maxWait);
}
public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
// 初始化
init();
// 判断filters是否存在过滤器,如果存在则先执行过滤器中的内容,(责任链模式)
if (filters.size() > 0) {
FilterChainImpl filterChain = new FilterChainImpl(this);
return filterChain.dataSource_connect(this, maxWaitMillis);
} else {
// 直接创建连接之后返回
return getConnectionDirect(maxWaitMillis);
}
}
init( )
采用Double Check机制,如果初始化完成,不会再次执行,避免系统多次初始化。
Filter
创建了一个FilterChainImpl对象,传入的参数是当前DruidDataSource对象。
DruidDataSource的父类DruidAbstractDataSource实现了接口DataSourceProxy中的方法:getProxyFilters
FilterChainImpl filterChain = new FilterChainImpl(this);
/**
* Class FilterChainImpl
*/
public FilterChainImpl(DataSourceProxy dataSource){
this.dataSource = dataSource;
this.filterSize = getFilters().size();
}
public List<Filter> getFilters() {
return dataSource.getProxyFilters();
}
/**
* Class FilterChainImpl
*/
@Override
public DruidPooledConnection dataSource_connect(DruidDataSource dataSource, long maxWaitMillis) throws SQLException {
// 如果当前pos小于filter的长度,说明仍有没处理完的过滤器
if (this.pos < filterSize) {
DruidPooledConnection conn = nextFilter().dataSource_getConnection(this, dataSource, maxWaitMillis);
return conn;
}
return dataSource.getConnectionDirect(maxWaitMillis);
}
/**
* Class FilterAdapter
*/
@Override
public DruidPooledConnection dataSource_getConnection(FilterChain chain, DruidDataSource dataSource,
long maxWaitMillis) throws SQLException {
return chain.dataSource_connect(dataSource, maxWaitMillis);
}
无论是否存在filter,都将通过getConnectionDirect( )创建连接。