是使用完后就直接关闭了吗?

解决方案 »

  1.   

    连接超时才会关闭,连接池关闭会报C3P0的连接关闭异常,目前已经不推荐使用C3P0了,因为C3P0容易是线程处于死锁,占用与数据库的连接..........使用完后是把连接放回连接池中,也就是按毫秒数暂停此线程的运行,通过比对连接池的配置文件中的连接时间,超过才销毁...任何连接池的连接,销毁就不会在创建...
      

  2.   


    我说的是java.sql.Connection,使用完后直接掉Connection.close()关闭吗?还是有其它方式释放?
      

  3.   

    使用连接池了,为啥还要自己去关心连接????楼主没手动JDBC,自然不同关闭了..........
      

  4.   


    使用 c3p0 的话,也是 java.sql.Connection,只要是 JDBC 都是这个接口的对象!使用完后必须 con.close() 掉,使用连接池的话,执行 con.close 并不会关闭与数据库的 TCP 连接,而是将连接还回到池中去,如果不 close 掉的话,这个连接将会一直被占用,直接连接池中的连接耗尽为止。至于是如何做到 con.close 并不是真正意义上的关闭连接?而是直接将连接还回到池中去?一般有两种方式:一:使用装饰器模式,在装饰器构造中传入一个真正的 Connection,这个装饰器实现 Connection,使用构造 传入 Connection 委托重写所有方法,并改写 close 方法:public class ConnectionDecorator implements Connection {    private Connection con = null;
        
        public ConnectionDecorator(Connection con) {
            this.con = con;
        }
        
        public void close() throws SQLException {
            // 重写!
        }    public void commit() throws SQLException {
            this.con.commit();
        }    public Statement createStatement() throws SQLException {        
            return this.con.createStatement();
        }    public Statement createStatement(int resultSetType, int resultSetConcurrency)
                throws SQLException {
            return this.con.createStatement(resultSetType, resultSetConcurrency);
        }    ......
    }然后经过连接池控制的 Connection 对象都使用该装饰器进行包装二:动态代理:使用动态代理重新实现 close 方法,每个获得 Connection 是一个代理后的对象。
    一个完善的连接池,其架构设计非常复杂,Connection#close 问题就是连接池诸多设计难点当中的一个。
      

  5.   

    如果close方法在c3p0中作为还回连接的方法,那么这个方法的签名就太不严谨了,极易引起误会。