使用C3P0连接池应该如何释放对当前数据库链接的占用?

发布于 2021-11-28 14:10:00 字数 508 浏览 393 评论 7

      在程序里用到C3P0连接池,参考的是网上的使用方法,用如下方法获取一个链接:
_ds = new ComboPooledDataSource();
...
Connection conn = _ds.getConnection();

      而在释放链接的时候,看到很多地方是这样写的:

conn.close();

      这样的话,conn这个链接应该就完全关闭了,而不是连接池的"将不用的链接重新回收",如果是这样的话,连接池的优势也就无法体现出来了,是否有其他的方法来解决这个问题,或者我的理解有误?谢谢。



如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

冷弦 2021-12-01 20:57:23

我也在困惑这个问题。

看了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方法也是会释放资源。

吃颗糖壮壮胆 2021-12-01 20:48:19

connection 的实例是数据库连接池二次封装的,对close方法进行了重写的。不会直接个关闭掉物理连接。而是重新把连接放回连接池。

眼眸里的那抹悲凉 2021-12-01 20:34:45

小伙子你首先要搞清楚连接池是什么意思, 是干什么用的. 知其然还要知其所以然才行啊. 连接池是一开始就从后台申请固定个数的数据库连接然后一直保持这个连接数, 谁申请就分配一个,用完了释放回去但是连接是不会中断的.这种情况下怎么可能会连接越来越多?

绝影如岚 2021-12-01 19:55:48

回复
或许是我没表述清楚。我知道获取的这个数据库链接不应该关闭,但我觉得直接调用Connection类下面的close()会使这个链接关闭掉,想知道的是ComboPooledDataSource类是否有其他的函数来把这个链接回收到连接池,或者Connection类下面的close()并不会实际上关闭这个链接,只是把这个链接放回数据库连接池

顾挽 2021-12-01 14:58:09

引用来自“雨翔河”的评论

不关闭,会自动回收的。你可以设置时间。

睫毛上残留的泪 2021-12-01 11:59:32

不关闭,会自动回收的。你可以设置时间。

白龙吟 2021-11-30 22:23:07

com.mchange.v2.c3p0.impl.NewProxyConnection@53f64158

用ComboPooledDataSource弄出来的connection是NewProxyConnection,该类重写了close方法,你close,不放释放connection而是放回连接池。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文