DBCP 源码初探

1、DBCP工具实现Java.sql.DataSource接口的类BasicDataSource 分析:
DataSource dataSource = new BasicDataSource(); //创建DBCP数据源实例对象

BasicDataSource类的成员变量:
保存了连接池的全部配置参数,构造函数BasicDataSource()对所有成员变量赋予了默认值,并对外提供了get、set方法来修改配置参数。如下摘取部成员变量被赋予的默认值:

protected boolean defaultAutoCommit  = true;
protected  Boolean defaultReadOnly = null;
protected  String driverClassName = null;
protected  int maxActive = 0;
protected  int maxIdle= 8;
protected  int minIdle= 0;
protected  int initialSize = 0;
protected  int maxWait = -1L;
protected  String password= null;
protected  String url= null;
protected  String username= null;
private boolean restartNeeded= false;
protected  GenericObjectPool connectionPool;  // 连接池对象,其属性 _pool 是List数据类型,保存了连接池中的连接对象。
protected Properties connectionProperties = new Properties();
protected DataSource  dataSource = null;
protected PrinterWriter logWriter  = new PrinterWriter(System.out);

//初始化成员变量dataSource
protected synchronized DataSource createDataSource() throws SQLException {
    if ( this.dataSource != null ) {
       // 判断是否已经实例化数据源实例对象变量
        return this.dataSource;     
    }
   ......
   // 实例化连接池
   if (this.abandonedConfig != null && XXX ) {
       this.connectionPool = new AbandonedObjectPool(null, 
         this.abandonedConfig);
   } else
   this.connectionPool = new GenericObjectPool(); 
   //connectionPool 拷贝BasicDataSource中的配置参数
   this.connectionPool.setMaxActive(this.maxActive);
   this.connectionPool.setMaxIdle(this.maxIdle);
   this.connectionPool.setMinIdle(this.minIdle);
   this.connectionPool.setMaxWait(this.maxWait);
   this.connectionPool.setTestOnBorrow(this.testOnBorrow);
   this.connectionPool.setTestOnReturn(this.testOnReturn);
   ......
   //实例化数据源实例对象
   this.dataSource = new PoolingDataSource(this.connectionPool); 
   //往连接池中添加connection对象
   for( int i=0; i < this.initialSize; ++i) {
            this.connectionPool.addObject();   
        }
    return this.dataSource;
}

//dataSource(PoolingDataSource)的getConnection方法获取连接
public Connection getConnection() throws SQLException {
    return createDataSource().getConnection();  
}

//BasicDataSource关闭连接池方法和重启方法
public synchronized void close() {
    GenericObjectPool oldpool =  this.connectionPool;
    this.connectionPool = null; //置空连接池
    this.dataSource = null;   //置空数据源实例对象
    try{
        oldpool .close();       // 关闭连接池
    }
    ......
}

private void restart() {
    this.close();
}

BasicDataSource的成员变量connectionPool(GenericObjectPool):
GenericObjectPool介绍:

public static final byte WHEN_EXHAUSTED_FAIL = 0;
......
//下面几个属性拷贝自BasicDataSource
private int _maxIdle;
private int _minIdle;
private int _maxActive;
private long _maxWait;
private volatible boolean _testOnBorrow;
private volatible boolean _testOnReturn;

private int _numActive;   //保存当前活跃的connection数量

//class CursorableLinkedList implements List,Serializable
private CursorableLinkedList _pool;
......
// 获取一个连接对象
public Object borrowObject() throws Exception {
    GenericKeyedObjectPool.ObjectTimestampPair pair = null;
    synchronized (this) {
        while (true) {
            //从List中移除连接
            pair = this._pool.removeFirst();
            ......
        }
        ......
        this._numActive += 1;
        ......
        return pair.value;
        ......
    }
}

//清空连接池
public synchronized void clear() {
    for (Iterator it = this._pool.iterator(); it.hasNext();) {
        this._factory.destroyObject(it.next().value);
    }
}

//返还一个连接对象
public void returnObject(Object obj) throws Exception{
    ......
    addObjectToPool(obj,true);
    ......
    synchronized(this) {
        this._numActive -= 1;
        notifyAll();
    }
}

//向连接池对象中增加连接
private void addObjectToPool(Object obj, bool decrementNumActive) {
    ......
    this._pool.addFirst(obj);
    ......
}

public synchronized void evict() throws Exception {
    ......
}

public synchronized void addObject() throws Exception {
    ......
}

private class Evictor extends TimerTask {
    ......
}

2、常用创建DBCP连接池方式:
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);

BasicDataSourceFactory的createDataSource方法:

public static DataSource createDataSource(Properties properties) throws Exception {
BasicDataSource dataSource = new BasicDataSource();
......
return dataSource;
}

你可能感兴趣的:(Java)