DruidDataSource类源码分析(一)

分析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( )创建连接。

DruidDataSource类源码分析(一)_第1张图片

你可能感兴趣的:(java,开发语言)