java频繁调用oracle存储过程返回游标问题,急
时间:2008-06-10 08:34:36
来源:论坛整理 作者: 编辑:chinaitzhe
环境: JDK1.5 Tomcat5.5 Eclipse 数据访问连接池
代码中频繁调用(差不多调用40次左右)oracle存储过程返回游标(记录集),会出现错误"超出游标最大数量"的提示,之后通过tomcat连接的所有数据库连接返回游标的都不行,但是直接在oracle里调试存储过程都没问题;重启Tomcat也能解决问题.
附调用存储过程的源代码:
/**
* 返回当前分页的数据集
* @param String sql 传入的sql语句
* @param int limit 每页显示最大记录数
* @param int pageNum 要显示的页码
* @param Map fieldMap 要显示的字段名(列头)
* @return List 显示的所有数据集
*/
public List getShowDatas(String sql,int limit,int pageNum,Map fieldMap){
CallableStatement callStam = null;
ResultSet rs = null;
Connection con = null;
ArrayList dataList = new ArrayList();
HashMap hashMap = null;
String fielden = null;
try {
con = PoolFactory.getPool().getConnection();
callStam = con.prepareCall("{call pkg_nop3.pro_getShowDatas(?,?,?,?)}");
callStam.registerOutParameter(4, OracleTypes.CURSOR);
callStam.setString(1, sql);
callStam.setInt(2, limit);
callStam.setInt(3, pageNum);
callStam.execute();
rs = (ResultSet)callStam.getObject(4);
while (rs.next()) {
hashMap = new HashMap();
Set keys = fieldMap.keySet();
Iterator it = keys.iterator();
while (it.hasNext()) {
fielden = (String) it.next();
hashMap.put(fielden, rs.getString(fielden));
}
dataList.add(hashMap);
}
return dataList;
} catch (Exception e) {
e.printStackTrace();
this.errorMessage = e.getMessage();
return null;
} finally {
PoolManager.close(rs);
if (callStam != null)
try {
callStam.close();
} catch (SQLException e) {
e.printStackTrace();
}
PoolManager.close(con);
}
}
网友回复:可能是你并发的时候引起的
把游标数调大看看
在init.ora中修改或新增open_cursors=128(或192),就应该够了
网友回复:你把Connection也关了试试``
增大游标数只能治标``
你注重在程序中及时关闭所有连接,不用就关,最终必关。这样就不至于将连接耗尽
网友回复:多谢2位帮忙!
关键字:java,频繁,调用,oracle,存储,过程,
上一篇:一个线程的问题,请大家帮忙
下一篇:下面没有链接了











文章评论
共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面