连接池: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,提高性能。不知道这样做是否合适?
//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,提高性能。不知道这样做是否合适?
query方法中的stm和rs均为DBManager的属性,定义如下:
private Statement stm;
private ResultSet rs;
问题二:不用rs和stm后,应该关闭掉stm和rs,以待系统回收资源。在search方法中三次访问数据库的时候可以用同一个Connection。
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,和连接池没什么关系了,这样会造成系统的不稳定。不知道小弟的理解是否正确,请高手指点!
2.不是前面定义了一个private Connection conn吗?不要在query中再声明一个。
3.单例模式只是说DBManager为单例,与它的getConnection中包含提供的获取连接的方法。
也得用 close 关掉,不过这里的 close 并不是你所想的与数据库的物理连接断
开,而是将这个连接归还到池中去,如果只拿不还的话,连接池中的连接很快就会
耗尽的。至于还回去后是否关闭连接、判断连接是否超时等一系列的工作,都是由
连接池在后台自行管理的,我们可以不用去管。连接池实现把 Connection 的 close 方法的行为给改变掉了,一般可以使用动
态代理或装饰器模式来改变其本身的行为。
也得用 close 关掉,不过这里的 close 并不是你所想的与数据库的物理连接断
开,而是将这个连接归还到池中去,如果只拿不还的话,连接池中的连接很快就会
耗尽的。至于还回去后是否关闭连接、判断连接是否超时等一系列的工作,都是由
连接池在后台自行管理的,我们可以不用去管。连接池实现把 Connection 的 close 方法的行为给改变掉了,一般可以使用动
态代理或装饰器模式来改变其本身的行为。