C3P0学习笔记(9.1.2版本)

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  接着判断连接是否处于管理中,不在=再调用本方法获取一个,在=返回本连接。 

猜你喜欢

转载自my.oschina.net/u/2874260/blog/1820470