本来想写一个简单的数据库连接池的,上网搜索了一下别人的实现,也看了一些开源的实现,感觉有些问题,那就是连接池中的Connection.close()应该干什么?按照API的说明,这个方法应该释放数据库和JDBC的资源,但是这样的话,连接池中的连接就要重新建立,似乎没有起到pool应有的作用,如果代码不进行close操作,交给其它的地方释放又不太安全。难到说我原来的代码习惯都是错的?取得一个Connection后,使用完不需要close,而是把相关的ResultSet和Statement关闭就行了?
找了很多文章,都没有提到这个问题。
目前来看,我不用关注那么多了,可能的解决方法就是让框架来执行数据库操作,执行完以后commit,关掉ResultSet和Statement,Connection保持连接,一定时间以后再close。
(Visited 2,930 times, 1 visits today)
2006年12月22日 at 18:58
用连接池的话,close后,应该是并没有释放
只是放回到连接池中
连接池可以使connection被重用
被控制可用的connection的数量
如果内部用stack实现的,只要控制这个stack的capcity就可以了哦
2006年12月22日 at 18:58
用连接池的话,close后,应该是并没有释放资源
只是放回到连接池中
连接池可以使connection被重用
被控制可用的connection的数量
如果内部用stack实现的,只要控制这个stack的capcity就可以了哦
2006年12月23日 at 10:37
我看过很多连接池的实现,调用close的时候会调用实际connection的close方法。当然我没有跟得那么深入,但是我想如果不close的话也可能有问题的。
2021年2月13日 at 05:07
大佬,我刚才用mybatis的时候,也在想这个问题,我就跟着查了他的源码,调用了实际Connection中的close方法,那应该就是关了连接啊,根本就没有归还连接啊。
2021年2月13日 at 05:14
网上的说法是,如果是从连接池中获取到的连接,则close不会关闭连接。可能是我找的mybatis的源码没找对,我再找找。
2021年2月13日 at 20:05
大佬,我知道你错在哪里了,他调用的并不是真实的Connection的close方法。
以mybatis3.5.6为例,我今天看了他连接池的源码,他里面获取的connection,实际上是获取的ProxyConnection,算是Connection的一个子类,该类实现了InvocationHandler的接口,里面判断如果是执行的close方法,则对该方法进行重写,使其归还连接到数据库连接池。
内部调用时,进行的获取连接和关闭连接,都是用的ProxyConnection。
2006年12月23日 at 16:47
不解
既然做了连接池应该就是为了重用资源
如果释放了资源,还不如用jdbc直连呢
如果请求的连接数超过了连接池的容量,可以让它挂起
至于你说不释放资源会引发的问题,我就不知道了
毕竟这方便经验我还很少,呵呵