使用C3P0连接池应该如何释放对当前数据库链接的占用?
在程序里用到C3P0连接池,参考的是网上的使用方法,用如下方法获取一个链接:
_ds = new ComboPooledDataSource(); ... Connection conn = _ds.getConnection();
而在释放链接的时候,看到很多地方是这样写的:
conn.close();
这样的话,conn这个链接应该就完全关闭了,而不是连接池的"将不用的链接重新回收",如果是这样的话,连接池的优势也就无法体现出来了,是否有其他的方法来解决这个问题,或者我的理解有误?谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
我也在困惑这个问题。
看了C3P0的源码,发现在c3p0PooledConnection的close方法里有如下语句:
try { physicalConnection.close(); }
catch (Exception e)
{
if (Debug.DEBUG)
{
if (known_invalid)
debugOnlyLog.append( e.toString() + ' ' );
else
logger.log(MLevel.WARNING, "An exception occurred.", exc);
e.printStackTrace();
}
exc = e;
}
也就是说,封装过的connection的close方法也是会释放资源。
connection 的实例是数据库连接池二次封装的,对close方法进行了重写的。不会直接个关闭掉物理连接。而是重新把连接放回连接池。
小伙子你首先要搞清楚连接池是什么意思, 是干什么用的. 知其然还要知其所以然才行啊. 连接池是一开始就从后台申请固定个数的数据库连接然后一直保持这个连接数, 谁申请就分配一个,用完了释放回去但是连接是不会中断的.这种情况下怎么可能会连接越来越多?
回复
或许是我没表述清楚。我知道获取的这个数据库链接不应该关闭,但我觉得直接调用Connection类下面的close()会使这个链接关闭掉,想知道的是ComboPooledDataSource类是否有其他的函数来把这个链接回收到连接池,或者Connection类下面的close()并不会实际上关闭这个链接,只是把这个链接放回数据库连接池
引用来自“雨翔河”的评论
不关闭,会自动回收的。你可以设置时间。
不关闭,会自动回收的。你可以设置时间。
com.mchange.v2.c3p0.impl.NewProxyConnection@53f64158
用ComboPooledDataSource弄出来的connection是NewProxyConnection,该类重写了close方法,你close,不放释放connection而是放回连接池。