如题.我的项目持久化层用的Hibernate2.数据库用的是ORACLE 10G 最近我做了一个分页方法,自己写的查询语句,没有使用Hibernate提供的分页方法.使用的JDBC连接数据库..程序运行没问题,但是当我多刷新几次分页显示的页面或者使用一段时间以后,就报错.javax.servlet.ServletException: ORA-01000:超出打开游标的最大数.去网上查了一下,大概都说Statement没有关闭或者ResultSet没有关闭导致游标打开数量超出,但是我都关了,还是会报这个错误..哪位朋友如果知道还需要关闭什么数据库相关的连接请告诉我~谢谢.
我关闭ResultSet的代码:
ResultSet countRes = baseService.pageCount(countSql);
if(countRes.next()){
pageTotal = Integer.parseInt(countRes.getString("pageCont"));
}
countRes.close();然后自己写了一个关闭的方法:
        public void closeCursors(){
Session session = HibernateSessionFactory.getSession();
Connection conn = null;
try{
conn = session.connection();
Statement stat=conn.createStatement();
stat.close();
                            conn.close();
HibernateUtils.closeSession();
}catch(Exception e){
e.printStackTrace();
}
}

解决方案 »

  1.   

    放在里边也不行 而且ResultSet是在别的类里使用的,没法放在一起关闭
      

  2.   

    countRes.close()加上
    stat.close(); 
    conn.close(); 
      

  3.   

    countRes.close()加上
    stat.close(); 
    conn.close(); 
      

  4.   

    countRes.close()加上 
    stat.close(); 
    conn.close(); 并且将 stat = null; conn = null;
      

  5.   

    我是先调用的底层分页方法:
    public synchronized ResultSet pageList(String sql,int pageFirst) throws SQLException {

    /*SELECT * FROM (SELECT rownum r,t1.* From 表名称 t1 where rownum < M + N) t2
    where t2.r >= M*/

    String pageSql = "select * from ("+sql+") t2 where t2.r >= "+(pageFirst+"");
    Connection c = this.getConn();
    Statement stat=c.createStatement();
    ResultSet res = stat.executeQuery(pageSql);
    HibernateUtils.closeSession();
    return res;
    }
    返回一个ResultSet
    然后在service类中接这个ResultSet进行处理,再关闭的:
    ResultSet countRes = baseService.pageCount(countSql); 
    if(countRes.next()){ 
    pageTotal = Integer.parseInt(countRes.getString("pageCont")); 

    countRes.close(); 怎么同时关闭Statement和ResultSet啊?service类中没有Connection和Statement对象...
      

  6.   

    public synchronized List pageList(String Id,String sql,int pageFirst) throws SQLException {

    /*SELECT * FROM (SELECT rownum r,t1.* From 表名称 t1 where rownum < M + N) t2
    where t2.r >= M*/

    String pageSql = "select * from ("+sql+") t2 where t2.r >= "+(pageFirst+"");
    Connection conn = this.getConn();
    Statement stat = conn.createStatement();
    ResultSet res = stat.executeQuery(pageSql);
    List idList = new ArrayList();
    while(res.next()){
    idList.add(res.getString(Id));
    }

    conn.close();
    stat.close();
    res.close();
    HibernateUtils.closeSession();

    return idList;
    }
      

  7.   

    能关的我都关了..还是不行啊. ... 80 more
    java.sql.SQLException: ORA-01000: 超出打开游标的最大数 at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
    at oracle.jdbc.ttc7.TTIoer.processError(TTIoer.java:289)
    at oracle.jdbc.ttc7.Oopen.receive(Oopen.java:120)
    at oracle.jdbc.ttc7.TTC7Protocol.open(TTC7Protocol.java:586)
      

  8.   

    啥跟啥啊!
    你这么办
    1 你看看你有几个 createStatement 或者 preparedStatement的地方,给他们编号
    2 每个都找到对应的stat.close语句,如果没有就肯定是少了。3 close 一定放到finally里面,这样可以保证一定会被关闭。就算有异常
      

  9.   

    另外,关闭顺序和获得顺序正好相反。
    先rs, 再stat,最后是con
      

  10.   

    LZ跟我一样都是白痴猪头!!YEAL!!!!
      

  11.   

    谢谢掌柜的方法,问题已经解决..原来是我写的一个自定义标签里有JDBC连接没关闭,一下循环了100多个游标,哈哈哈.