java.lang.AbstractMethodError: org.apache.tomcat.dbcp.dbcp.DelegatingResultSet.isClosed()Z
错误代码如上,我是在执行
finally{
closeCon(con, ps, rs);
}
时出现上述提示的,好像是ResultSet已关闭啥的,但是con,ps和rs三个的确是有值的啊。而且我在使用jdbc连接数据库时正常,但在换用数据库连接池后就出现错误。
崩溃了。
相关代码如下:public void closeCon(Connection con, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null && !rs.isClosed()) {
rs.close();
rs = null;
}
if (ps != null && !ps.isClosed()) {
ps.close();
ps = null;
}
if (con != null && !con.isClosed()) {
con.close();
con = null;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
错误代码如上,我是在执行
finally{
closeCon(con, ps, rs);
}
时出现上述提示的,好像是ResultSet已关闭啥的,但是con,ps和rs三个的确是有值的啊。而且我在使用jdbc连接数据库时正常,但在换用数据库连接池后就出现错误。
崩溃了。
相关代码如下:public void closeCon(Connection con, PreparedStatement ps, ResultSet rs) {
try {
if (rs != null && !rs.isClosed()) {
rs.close();
rs = null;
}
if (ps != null && !ps.isClosed()) {
ps.close();
ps = null;
}
if (con != null && !con.isClosed()) {
con.close();
con = null;
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
这位兄台讲的极在道理,好像就是这么回事,能否说一下连接池的工作原理?
它是自动关闭ResultSet和PreparedStatement的吗?
!rs.isClosed()
!ps.isClosed()
两行,可是这两行的计算结果不是boolean值吗?
为什么写普通代码访问数据库后关闭时这样写就没错,而换用数据库连接池访问后关闭时就出错呢?
* 关闭数据
* */
public void closeALL()
{
try {
if(rs!=null) rs.close() ;
if(pst!=null)pst.close();
if(st!=null) st.close();
if(conn!=null)
{
conn.close();
//threadLocal.set(null);
}
} catch (Exception e) {
// TODO: handle exception
}
}
按照您的这个方式来关闭是没有问题的,可我现在的疑问是,为什么加上!rs.isClosed()这个了就不行了呢?
rs无论关闭与否,都不应该出错啊,因为这个表达式的结果不就是boolean值吗?
指org.apache.tomcat.dbcp.dbcp.DelegatingResultSet并没有实现isClosed()方法,
你却在这里进行了调用。
若你确实需要调用该方法,可以考虑直接使用其它驱动,而不是tomcat的代理对象。
如:oracle.jdbc.driver.OracleResultSet
进行关闭操作时,无论rs,ps是否成功关闭,必须保证con关闭。
con关闭后,其产生在Statement和ResultSet,将被隐式关关闭。
为了能够使GC顺利回收con对象,最好con=null进行置空操作。
参考代码如下:
public void closeCon(Connection con, PreparedStatement ps, ResultSet rs) {
try{
if (rs != null) {
rs.close();
}
}catch (SQLException e) {
}
try{
if (ps != null) {
ps.close();
}
}catch (SQLException e) {
} try{
if (con != null) {
con.close();
}
}catch (SQLException e) {
}
rs = null;
ps = null;
con = null;
}