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();
}
}

解决方案 »

  1.   

    没想法,debug 跟进去看看,仔细看看 exception trace, 感觉好像不是你这段代码抛出来的 
      

  2.   


    这位兄台讲的极在道理,好像就是这么回事,能否说一下连接池的工作原理?
    它是自动关闭ResultSet和PreparedStatement的吗?
      

  3.   

    代码就错在closeCon方法中
    !rs.isClosed()
    !ps.isClosed()
    两行,可是这两行的计算结果不是boolean值吗?
    为什么写普通代码访问数据库后关闭时这样写就没错,而换用数据库连接池访问后关闭时就出错呢?
      

  4.   

    /**
     * 关闭数据
     * */
    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
    }
    }
      

  5.   


    按照您的这个方式来关闭是没有问题的,可我现在的疑问是,为什么加上!rs.isClosed()这个了就不行了呢?
    rs无论关闭与否,都不应该出错啊,因为这个表达式的结果不就是boolean值吗?
      

  6.   

    java.lang.AbstractMethodError是调用抽象接口错误
    指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;
        }