DruidDataSource类源码分析(一)

本文解析了DruidDataSource中getConnection方法的实现,介绍了DoubleCheck机制和责任链模式的应用,重点讲解了FilterChain和DataSourceProxy中的filter处理过程。
摘要由CSDN通过智能技术生成

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值