永发信息网

iBatis缘何出现(ORA-01000)最多允许打开的游标数错误?如何验证问题发生的原因?

答案:2  悬赏:80  手机版
解决时间 2021-01-04 16:33
  • 提问者网友:孤凫
  • 2021-01-04 03:46
先说一下我这边的情况。

系统用Spring+iBatis连结Oracle,连结数据库的处理使用Spring接口。

数据更新处理中,同时有使用batch-mode更新数据和不使用batch-mode更新数据,
此时,在正式的数据库环境中出现了(ORA-01000)最多允许打开的游标数错误。
当把所有的数据更新处理改为不使用batch-mode,程序会正常运行。

想要找出发生错误的原因,在测试环境中再现类似的错误。
但是无论怎么弄,在测试环境中都无法实现。

OPEN_CURSORS降到了3,用JMeter同时连接多个线程虚拟真实环境的流量也没用。
整个程序就像着了魔一样,在测试环境中就是实现不了(ORA-01000)最多允许打开的游标数错误。

如题,请高人指点!

目前我最想知道的事,如何在不修改程序代码的前提下,实现发生(ORA-01000)最多允许打开的游标数错误的情况。

因为这个ORA-01000并不是在所有情况下都发生,我想找出发生ORA-01000的原因。
最佳答案
  • 五星知识达人网友:一叶十三刺
  • 2021-01-04 04:55
出现这个错误的原因多是因为ResultSet或者是statement没有被及时关闭造成的。你JMeter测试的时候尽管OPEN_CURSORS降到了3,但是资源被正常关闭的情况下还是可以运行正常。
解决这个问题,可以用V$OPEN_CURSOR VIEW来查看具体出问题的是哪些SQL,从而找到问题点。
SELECt SID, USER_NAME, SQL_TEXT FROM V$OPEN_CURSOR;
执行上面的语句,查看哪些session打开了游标。
另外,由于ORA-01000错误,多半是多次循环处理中出现的问题,可以用如下SQL查看被多次发行的SQL
SQL> SELECt OC.SID, OC.USER_NAME, ST.SQL_TEXT, OC.NUM_CURSORS
2 FROM V$SQL ST
3 INNER JOIN (
4 SELECt SID, USER_NAME, ADDRESS, HASH_VALUE, COUNT(*) NUM_CURSORS
5 FROM V$OPEN_CURSOR
6 GROUP BY SID, USER_NAME, ADDRESS, HASH_VALUE
7 HAVINg COUNT(*) > 1
8 ) OC
9 ON OC.ADDRESS = ST.ADDRESS
10 AND OC.HASH_VALUE = ST.HASH_VALUE
11 ORDER BY OC.SID;
如果检索结果中NUM_CURSORS的数目很大,说明那条SQL发行的时候没有被正常关闭,从而找到问题点。
全部回答
  • 1楼网友:轻雾山林
  • 2021-01-04 05:19
你好 楼主。 很幸运的看到你的问题。 但是又很遗憾到现在还没有人回答你的问题。也可能你现在已经在别的地方找到了答案,那就得恭喜你啦。 对于你的问题我爱莫能助! 可能是你问的问题有些专业了。或者别人没有遇到或者接触过你的问题,所以帮不了你。建议你去问题的相关论坛去求助,那里的人通常比较多,也比较热心,可能能快点帮你解决问题。 希望我的回答也能够帮到你! 祝你好运。 快过年了, 最后祝您全家幸福健康快乐每一天!
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯