如题.我的项目持久化层用的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();
}
}
我关闭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();
}
}
stat.close();
conn.close();
stat.close();
conn.close();
stat.close();
conn.close(); 并且将 stat = null; conn = null;
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对象...
/*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;
}
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)
你这么办
1 你看看你有几个 createStatement 或者 preparedStatement的地方,给他们编号
2 每个都找到对应的stat.close语句,如果没有就肯定是少了。3 close 一定放到finally里面,这样可以保证一定会被关闭。就算有异常
先rs, 再stat,最后是con