DBCP 学习-1
    BasicDataSourceFactory 使用JNDI时用来创建 BasicDataSource 
BasicDataSource 
先创建一个ConnectionFactory (DriverConnectionFactory) 驱动连接工厂,通过加载driverClassName, Class.forName(driverClassName); 
再根据url得到Driver, DriverManager.getDriver(url); 
设置连接属性 connectionProperties 用户密码 
创建一个DriverConnectionFactory,驱动连接工厂,其实就是物理连接的创建工厂,这里创建的都是真实的连接 
真实连接创建工厂创建完之后,再来创建一个connectionPool用来存放连接,在这里 如果是要跟踪废弃的连接 则创建 AbandonedObjectPool 否则 GenericObjectPool 
对对象池设置一些属性,如 最大连接数 最大空闲数 最小空闲数等 
如果 isPoolPreparedStatements() 为true 表明会为预处理语句池化,则需要一个 
GenericKeyedObjectPoolFactory,用来为预处理语句 创建一个一个对象池 
物理连接创建工厂已经ok,连接池已经ok 
此时 创建一个 PoolableConnectionFactory, 将 driverConnectionFactory connectionPool statementPoolFactory 
创建一个 PoolableConnectionFactory, 这个对象将从driverConnectionFactory中获得连接,放入 connectionPool 
PoolableConnectionFactory 这个对象对外不可见 
获得连接通过 connectionPool 的 getConnection 来从池中取 
使用 PoolingDataSource 对 connectionPool 包装 
初始化池:  根据 initialSize 往 connectionPool 中添加指定个数的连接返回一个DataSource 
所以:从BasicDataSource中取的一个连接经过: 
PoolingDataSource.getConnection() 
从connectionPool 中 borrow 一个连接  AbandonedObjectPool(connectionPool).borrowObject() 
  在创建PoolableConnectionFactory时 虽然没有返回PoolableConnectionFactory,但是会设置pool的connectionFactory 
  这样在pool  getConnection()的时候,会由connectionFactory来负责,决定是 makeObject 还是激活钝化等等 
  在borrowObject时会根据需要决定时 创建一个新的或者是activateObject 
  在returnObject 回调用 addObjectToPool 将对象返回到池中 
  内部有一个Evictor TimerTask,会 根据 _timeBetweenEvictionRunsMillis 定时来钝化一些连接 (PoolableConnectionFactory.makeObject() 生产的连接 最终是 PoolingConnection 通过PoolableConnection返回) 
PoolingDataSource将这个连接包装起来返回 
AbandonedTrace用来跟踪被废弃的对象 
连接包括一些其他对象 如 resultset statement 都需要继承这个类 
Delegating的对象都是为了增加AbandonedTrace而产生不会改变原来的方法的行为 池化的功能不再这里实现 
DelegatingConnection  close方法会先调用 钝化方法 之后会关闭连接 
DelegatingDatabaseMetaData 
DelegatingResultSet DelegatingStatement DelegatingPreparedStatement DelegatingCallableStatement 
PoolableConnection 继承 DelegatingConnection 
PoolableConnection覆盖close()方法,这里close不会将连接真的关闭,poolable在这里实现 
PoolableCallableStatement PoolablePreparedStatement 都是如此 
PoolingConnection 会对 预编译语句pool