oracle游标打开过多问题 能不能rollback或者commit一下,游标就无效了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 这是我比较困惑的问题,从mysql转到oracle,还没完全适应过来。init.ora中默认游标数是300,应该也不少了。那些隐式的游标是怎么工作的,不能自己释放吗 可以把 oracle 中控制打开游标数的变量设置的大一点,参数好像事 open_cursor 默认是 300,设置为 1000 应该够用了 我改了一下存储参数,把下一扩展区值改为1M(初始扩展区大小没改,是128k),发现情况好点,两个人同时按住F5刷新,过了十几秒(先前是一个人按住十几秒)后用select count(*) from v$open_cursor 查看了一下,发现游标数打开已经超过300,刚好数据库down掉。但是很快游标又被释放出去剩下十几个。这样看来,增加游标数是必须的了。 一次查询完了,不光ResultSet要关闭,其他的connection, statement也要关闭,关闭的时候注意把关闭的操作放在finally中。关闭时候按照ResultSet, statement,connection的顺序来,并且要注意,不要出现因为关闭ResultSet出错,而导致关闭statement,connection的操作未被执行的情况。 几乎可以肯定的说,这是程序的问题.除了用上面的方法之外,还可以考虑缓存connection,statement的办法,将过期未关闭的connection,statement强制关闭。 没有使用过程,我是在公共类一个方法里面,从连接池获得一个连接,然后用jdbc创建statement执行查询语句,返回一个结果集.象这样:public ResultSet getRS(String sql) { ResultSet rs = null; ConnectionPool tPool = this.APool; if(!tPool=null) { try { Statement Stmt = tPool.createStatement(); rs = Stmt.executeQuery(sSql); Stmt.close(); Stmt = null; } catch (Exception ex) { System.out.println("Error sql:"+sql); ex.printStackTrace();} } else {///}return rs;}然后就是在程序中调用这个方法,获得一个结果集,在try {}块中rs.close();rs=null;问题是Statement不是对应显式游标的吗?我把语句和结果集都关闭了,但是从selectcount(*) from v$open_cursor来看,游标数飚升的非常快,一下子就达到最大数溢出了 这个地方有问题-------------------------------rs = Stmt.executeQuery(sSql);Stmt.close();-------------------------------当Stmt.executeQuery(sSql);抛出SQLException时,Stmt.close();不会被执行到。正确的做法是try{...rs = Stmt.executeQuery(sSql);...}catch(SQLException e){}finally{Stmt.close();} Stmt.close()放在finally里会提示sqlexception没有捕获正确的关闭次序应该是resultset,statement,connection,而在我上面rs和stmt的关闭次序颠倒过来了 我觉的问题是在于你编程的问题。java程序中,在一个循环中,使用createStatement();就可有可能引起这类问题。最好的,应该是使用preparedstatement,循环中,是设置查询参数。 还有,我觉得你这样,把ResultSet返回去的做法有问题,一般是直接这样,try{...rs = Stmt.executeQuery(sSql);while(rs.next()){ Row row = new Row(); ...//取得数据 data.add(row);}...}catch(SQLException e){}finally{rs.close();Stmt.close();} 弄了一个下午,现在终于有点头绪了,谢谢各位。to: sijian2001(海阔天空),直接返回resultset的做法有什么弊端呢?看来有时间得把某些公共类优化一下了。另外谢谢你耐心的回答。to: enhydraboy(乱舞的浮尘),你说的不错,我现在返回去看代码,发现有些地方,比如在一个while(rs.next()){}块中还产生了另一个resultset,即循环调用了createStatement(),现在改为用一条比较复杂的sql查询到所有需要的数据,产生的游标数就少了好多。查了一些资料,好象是说jdbc的close()方法是软关闭,在cache中还要留一些时间。而一个session中可以打开的游标数跟open_cursor有关,目前还是暂时先把它设为1000看看。 写个存储例程???急!! oracle查询问题求助 randomize 的速度问题,请教 Oracle union效率 请教一个透明网关对于SQL SERVER字段支持的问题 一家公司的笔试题目,大家来答答看,顺便涨涨知识! 关于 公共网->DB1<->防火墙<->DB2<-内网 的交互问题 数据库连接出问题了 菜鸟的一个特简单sql 报个到 数据备份问题:两台机器都装了ORACLE,库结构一样,A机器中的数据变化时,如何也同样修改B机器中的数据? Oracle字符集问题(巨 难),高手请进!………………………………………………
public ResultSet getRS(String sql) {
ResultSet rs = null;
ConnectionPool tPool = this.APool;
if(!tPool=null) {
try {
Statement Stmt = tPool.createStatement();
rs = Stmt.executeQuery(sSql);
Stmt.close();
Stmt = null;
} catch (Exception ex) {
System.out.println("Error sql:"+sql);
ex.printStackTrace();
}
} else {///}return rs;}
然后就是在程序中调用这个方法,获得一个结果集,在try {}块中rs.close();rs=null;问题是Statement不是对应显式游标的吗?我把语句和结果集都关闭了,但是从select
count(*) from v$open_cursor来看,游标数飚升的非常快,一下子就达到最大数溢出了
-------------------------------
rs = Stmt.executeQuery(sSql);
Stmt.close();
-------------------------------
当Stmt.executeQuery(sSql);抛出SQLException时,Stmt.close();不会被执行到。
正确的做法是
try
{
...
rs = Stmt.executeQuery(sSql);
...
}
catch(SQLException e)
{
}
finally
{
Stmt.close();
}
java程序中,在一个循环中,使用createStatement();就可有可能引起这类问题。
最好的,应该是使用preparedstatement,循环中,是设置查询参数。
try
{
...
rs = Stmt.executeQuery(sSql);
while(rs.next()){
Row row = new Row();
...//取得数据
data.add(row);
}
...
}
catch(SQLException e)
{
}
finally
{
rs.close();
Stmt.close();
}
to: sijian2001(海阔天空),直接返回resultset的做法有什么弊端呢?
看来有时间得把某些公共类优化一下了。另外谢谢你耐心的回答。to: enhydraboy(乱舞的浮尘),你说的不错,我现在返回去看代码,发现有些地方,
比如在一个while(rs.next()){}块中还产生了另一个resultset,即循环调用了createStatement(),现在改为用一条比较复杂的sql查询到所有需要的数据,产生的游标数就少了好多。查了一些资料,好象是说jdbc的close()方法是软关闭,在cache中还要留一些时间。而一个session中可以打开的游标数跟open_cursor有关,目前还是暂时先把它设为1000看看。