Druid-代码段-1-2

所属文章:池化技术(一)Druid是如何管理数据库连接的?

 本代码段对应流程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; //返回
    }
posted @ 2019-09-21 11:28  是胖虎捏  阅读(256)  评论(0编辑  收藏  举报