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