c3p0 服务启动获取连接超时_c3p0获取连接Connection后的Close()---释疑

abstract class AbstractPoolBackedDataSource

extends PoolBackedDataSourceBase

implements PooledDataSource{

//.....

// dataSource.getConnection()所调用的就是该方法

//implementation of javax.sql.DataSource

public Connection getConnection() throws SQLException{

PooledConnection pc =

getPoolManager(). // 返回 C3P0PooledConnectionPoolManager

getPool(). // 返回 C3P0PooledConnectionPool

checkoutPooledConnection(); // 返回PooledConnection

return pc.getConnection();

}

//.....

}

class C3P0PooledConnectionPool{

// ....

public PooledConnection checkoutPooledConnection() throws SQLException{

//System.err.println(this + " -- CHECKOUT");

try

{

PooledConnection pc = (PooledConnection) this.checkoutAndMarkConnectionInUse();

pc.addConnectionEventListener( cl );

return pc;

}

catch (TimeoutException e)

{ throw SqlUtils.toSQLException("An attempt by a client to checkout a Connection has timed out.", e); }

catch (CannotAcquireResourceException e)

{ throw SqlUtils.toSQLException("Connections could not be acquired from the underlying database!", "08001", e); }

catch (Exception e)

{ throw SqlUtils.toSQLException(e); }

}

private Object checkoutAndMarkConnectionInUse() throws TimeoutException, CannotAcquireResourceException, ResourcePoolException, InterruptedException

{

Object out = null;

boolean success = false;

while (! success)

{

try

{

out = rp.checkoutResource( checkoutTimeout );

if (out instanceof AbstractC3P0PooledConnection)

{

// cast should succeed, because effectiveStatementCache implies c3p0 pooled Connections

AbstractC3P0PooledConnection acpc = (AbstractC3P0PooledConnection) out;

/*

*以下在获取物理连接的时候,PooledcConnection中注册的事件监听器会收到消息

*无论每次对connection的何种操作,PooledConnection都会收到来自驱动的消息,

*其中的钩子(hook)对象就会完成对Connection的回收

*/

Connection physicalConnection = acpc.getPhysicalConnection();

success = tryMarkPhysicalConnectionInUse(physicalConnection);

}

else

success = true; //we don't pool statements from non-c3p0 PooledConnections

}

finally

{

try { if (!success && out != null) rp.checkinResource( out );}

catch (Exception e) { logger.log(MLevel.WARNING, "Failed to check in a Connection that was unusable due to pending Statement closes.", e); }

}

}

return out;

}

//....

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值