连接池:apache DBCPpublic class DBManager {
//private Connection conn; 
//前面的省略
//
//...........单例模式,代码省略
////关键是对下面这个方法存在很多疑问,想请教高手。
public  ResultSet query(String sql) throws Exception {
try {
Connection conn = getConnection();
stm = conn.createStatement();
rs = stm.executeQuery(sql);
} catch (Exception e) {
//.............
}  return rs;
}
}
1.我采用的是数据库连接池,数据库连接通过apache提供的实现类直接获得,不是通过xml配置文件。使用完连接后,按照连接池实现原理,应该是连接池回收连接,而不是close连接。但是我老大给了我个例子,发现用完后全给close掉了,弄得我很迷糊,各位是如何处理的,我找了半天也没见apache提供了回收连接的方法,难道使用完后直接关掉吗?2.在query方法中,stm和rs是否应在使用完后关掉,也就是在DBManager类中提供如下方法:
public synchronized void close() {
        try{
            if(rs != null) {
                rs.close();
                rs = null;
            }
        }catch(SQLException e) {
            ;
        }
        try{
            if(stm != null) {
                stm.close();
                stm = null;
            }
        }catch(SQLException e) {
            ;
        }
    }另外,由于外部有个方法search需要三次访问数据库,我在DBManager类中提供了如下方法:
public  ResultSet query(Connection con,String sql) throws Exception {
try {
stm = con.createStatement();
rs = stm.executeQuery(sql);
} catch (Exception e) {
//........
}  return rs;
}目的是想在search方法中三次访问数据库的时候都用同一个Connection,提高性能。不知道这样做是否合适?

解决方案 »

  1.   

    补充一下:
    query方法中的stm和rs均为DBManager的属性,定义如下:
    private Statement stm;
    private ResultSet rs;
      

  2.   

    问题一:使用完连接后,应该有close链接的操作,要不连接池认为还是占用链接的,所以一般的在异常处理后加finally {//关闭数据库连接}
    问题二:不用rs和stm后,应该关闭掉stm和rs,以待系统回收资源。在search方法中三次访问数据库的时候可以用同一个Connection。
      

  3.   

    如果关闭连接则又产生新的问题,如下面的方法:
    public  ResultSet query(String sql) throws Exception {
    try {
        Connection conn = getConnection();
        stm = conn.createStatement();
        rs = stm.executeQuery(sql);
    } catch (Exception e) {
    //.............
    } 1.在上述方法中如果使用完后关闭掉则返回的rs肯定无效了。
    2.如果不关,则其他方法关闭不了query中的conn
    3.如果非得要关,则只能将conn定义为DBManager类的属性,由于DBManager类为单例,这样一来query方法则一直使用同一个Connection,和连接池没什么关系了,这样会造成系统的不稳定。不知道小弟的理解是否正确,请高手指点!
      

  4.   

    1.就不要在这里关闭。到外面用完以后在关闭。
    2.不是前面定义了一个private Connection conn吗?不要在query中再声明一个。
    3.单例模式只是说DBManager为单例,与它的getConnection中包含提供的获取连接的方法。
      

  5.   

    Connection 在使用完后必须用 close 关掉,如果你采用的是开源连接池的话,
    也得用 close 关掉,不过这里的 close 并不是你所想的与数据库的物理连接断
    开,而是将这个连接归还到池中去,如果只拿不还的话,连接池中的连接很快就会
    耗尽的。至于还回去后是否关闭连接、判断连接是否超时等一系列的工作,都是由
    连接池在后台自行管理的,我们可以不用去管。连接池实现把 Connection 的 close 方法的行为给改变掉了,一般可以使用动
    态代理或装饰器模式来改变其本身的行为。
      

  6.   

    Connection 在使用完后必须用 close 关掉,如果你采用的是开源连接池的话,
    也得用 close 关掉,不过这里的 close 并不是你所想的与数据库的物理连接断
    开,而是将这个连接归还到池中去,如果只拿不还的话,连接池中的连接很快就会
    耗尽的。至于还回去后是否关闭连接、判断连接是否超时等一系列的工作,都是由
    连接池在后台自行管理的,我们可以不用去管。连接池实现把 Connection 的 close 方法的行为给改变掉了,一般可以使用动
    态代理或装饰器模式来改变其本身的行为。
      

  7.   

    你只要都是用CLOSE()方法 关就可以了 但是其实用连接池是把那个引用给断开了  而另外一个则不是