1.获取连接
用户应用 主动调用=getConnection方法获取连接。
方法在C3P0的AbstractPoolBackedDataSource类中实现,
源码如下:
public abstract class AbstractPoolBackedDataSource extends PoolBackedDataSourceBase implements PooledDataSource
//implementation of javax.sql.DataSource
public Connection getConnection() throws SQLException
{
PooledConnection pc = getPoolManager().getPool().checkoutPooledConnection();
return pc.getConnection();
}
注意,此时得到的是:代理连接,而不是真正的物理连接
2. 连接代理PooledConnection说明
这个结构定义在javax.sql中,是sun针对连接池的接口。
它本身包含:connection,和这个connection相关的所有statement,result。
一个checkout的connection相关的所有数据库操作,都被pooledconnection所管理。
注意这是一个javax接口,c3p0中的默认实现类=NewPooledConnection
操作数据库相关操作:Connection,Statement,Result 的接口在C3P0中分别为:
NewProxyConnection,NewProxyStatement,NewProxyResultSet,
它们统一由PooledConnection接口管理。
3. 连接池类=BasicResourcePool
4.获取连接的步骤
4.1 获取连接:Object resc = prelimCheckoutResource(timeout);
原理: 查看池中是否有未使用的connection, 有=返回(还要判断是否空闲、是否过期);
没有=如果没有达到最大数,就生成一个新的,已达最大数量就等待。
4.2 检查连接可用性 booleanrefurb =attemptRefurbishResourceOnCheckout(resc)
4.3 接着判断连接是否处于管理中,不在=再调用本方法获取一个,在=返回本连接。