连接池的Connection问题

项目中使用了proxool数据源,配置了静态创建连接类。

 

public class DBConnection {
    public static Connection getConn() throws Exception{
         
        return DriverManager.getConnection("proxool.db_master");
         
    }
     
    public static void closeDB(Connection conn){
        try{
             
            if (conn!=null) conn.close();
             
        }catch (Exception e) {
            // TODO: handle exception
        }
    }}

 那这样使用的时候还需不需要调用Connection.close()方法呢?

try{conn.close();conn=null;}catch(Exception e){}

这个close方法是直接调用了java.sql.Connection.close()方法,这样是不是绕过连接池直接关闭 Conn了呢?

如果需要那么Connection就是我手动关闭的,跟连接池没什么关系?
如果不关闭的话那是什么时候关闭呢?
请达人给我解释一下。               

3个回答

数据库连接池,就是一个放数据库连接并统一管理的池(似乎是废话),程序要用连接就跟它要,用完了还给它就行了,不需要使用者去自己关闭,那样违背了数据库连接池的初衷。

[b]为什么使用数据库连接池?[/b]
因为数据库连接每次申请一个连接,用完后关闭连接,这两个过程其实都是非常耗费资源的,一个数据库连接其实是可以不断重复利用的。怎么重复利用呢?那就由数据库连接池来解决。数据库连接池可以启动时就初始化一些连接,程序要用时到池里来拿,拿完还回池里,给后面的程序用,这样就实现了重复利用节省时间和性能损耗。同时数据库连接池会有最大连接数,防止数据库连接耗尽导致数据库不可用的严重问题。

当然,数据库连接池的实现中还有各种各样的策略,都是为了满足各种需求。

详细再看看数据库连接池的原理。

Java中数据库连接池原理机制的详细讲解
[url]http://blog.csdn.net/ilibaba/article/details/3996962[/url]

yunzhu666
yunzhu666 应该会有一点影响,因为多出了跟数据库申请连接的请求了。 主要是对程序的性能影响,申请连接释放连接都要耗费时间和资源的。
6 年多之前 回复
jianzh5
jianzh5 那我开关一下会影响数据库运行的速度吗?
6 年多之前 回复

proxool是个连接池,那么从连接池里获取的连接到底是原生的Connection,还是代理的Connection呢?

实际上,proxool返回的是个代理的Connection,虽然你调用了closeDB方法,但是你关闭的仅仅是代理Connection。而proxool底层实际Connection还是没有关闭。它仅仅是关闭所有的statement,重置connection的代理,并修改状态active为available。并没有调用底层(数据库驱动实现的Connection接口实例的close方法)

只有你调用removeProxyConnection方法才会真正关闭。

一般你不需要自己去执行,因为既然是个连接池,它会给你管理好connection的。

Dead_Knight
Dead_Knight 与数据库关系不大。你调用close还不是数据库驱动的close方法。
6 年多之前 回复
jianzh5
jianzh5 受教了! 那我开关一下会影响数据库运行的速度吗?
6 年多之前 回复
yunzhu666
yunzhu666 原来proxool还有这重原理啊,受教了
6 年多之前 回复

不要去调用java.sql.Connection.close()方法,你直接把连接关闭了,已经失去了利用连接池的好处,你应该调用连接池提供的释放连接方法。

jianzh5
jianzh5 那我开关一下会影响数据库运行的速度吗?
6 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!