解惑

解己之惑,解人之惑

连接池中的Connection.close()应该干什么?

本来想写一个简单的数据库连接池的,上网搜索了一下别人的实现,也看了一些开源的实现,感觉有些问题,那就是连接池中的Connection.close()应该干什么?按照API的说明,这个方法应该释放数据库和JDBC的资源,但是这样的话,连接池中的连接就要重新建立,似乎没有起到pool应有的作用,如果代码不进行close操作,交给其它的地方释放又不太安全。难到说我原来的代码习惯都是错的?取得一个Connection后,使用完不需要close,而是把相关的ResultSet和Statement关闭就行了?
找了很多文章,都没有提到这个问题。
目前来看,我不用关注那么多了,可能的解决方法就是让框架来执行数据库操作,执行完以后commit,关掉ResultSet和Statement,Connection保持连接,一定时间以后再close。

(Visited 2,930 times, 1 visits today)

7 Comments

  1. 用连接池的话,close后,应该是并没有释放
    只是放回到连接池中
    连接池可以使connection被重用
    被控制可用的connection的数量
    如果内部用stack实现的,只要控制这个stack的capcity就可以了哦

  2. 用连接池的话,close后,应该是并没有释放资源
    只是放回到连接池中
    连接池可以使connection被重用
    被控制可用的connection的数量
    如果内部用stack实现的,只要控制这个stack的capcity就可以了哦

  3. 我看过很多连接池的实现,调用close的时候会调用实际connection的close方法。当然我没有跟得那么深入,但是我想如果不close的话也可能有问题的。

    • 大佬,我刚才用mybatis的时候,也在想这个问题,我就跟着查了他的源码,调用了实际Connection中的close方法,那应该就是关了连接啊,根本就没有归还连接啊。

    • 网上的说法是,如果是从连接池中获取到的连接,则close不会关闭连接。可能是我找的mybatis的源码没找对,我再找找。

      • 大佬,我知道你错在哪里了,他调用的并不是真实的Connection的close方法。
        以mybatis3.5.6为例,我今天看了他连接池的源码,他里面获取的connection,实际上是获取的ProxyConnection,算是Connection的一个子类,该类实现了InvocationHandler的接口,里面判断如果是执行的close方法,则对该方法进行重写,使其归还连接到数据库连接池。
        内部调用时,进行的获取连接和关闭连接,都是用的ProxyConnection。

  4. 不解
    既然做了连接池应该就是为了重用资源
    如果释放了资源,还不如用jdbc直连呢
    如果请求的连接数超过了连接池的容量,可以让它挂起
    至于你说不释放资源会引发的问题,我就不知道了
    毕竟这方便经验我还很少,呵呵

发表评论

邮箱地址不会被公开。 必填项已用*标注

© 2024 解惑

本主题由Anders Noren提供向上 ↑