出现这个错误的原因多是因为ResultSet或者是statement没有被及时关闭造成的。你JMeter测试的时候尽管OPEN_CURSORS降到了3,但是资源被正常关闭的情况下还是可以运行正常。
解决这个问题,可以用V$OPEN_CURSORVIEW来查看具体出问题的是哪些SQL,从而找到问题点。
SELECTSID,USER_NAME,SQL_TEXTFROMV$OPEN_CURSOR;
执行上面的语句,查看哪些session打开了游标。
另外,由于ORA-01000错误,多半是多次循环处理中出现的问题,可以用如下SQL查看被多次发行的SQL
SQL>SELECTOC.SID,OC.USER_NAME,ST.SQL_TEXT,OC.NUM_CURSORS
2
FROMV$SQLST
3
INNERJOIN(
4
SELECTSID,USER_NAME,ADDRESS,HASH_VALUE,COUNT(*)NUM_CURSORS
5
FROMV$OPEN_CURSOR
6
GROUPBYSID,USER_NAME,ADDRESS,HASH_VALUE
7
HAVINGCOUNT(*)>1
8
)OC
9
ONOC.ADDRESS=ST.ADDRESS
10
ANDOC.HASH_VALUE=ST.HASH_VALUE
11
ORDERBYOC.SID;
如果检索结果中NUM_CURSORS的数目很大,说明那条SQL发行的时候没有被正常关闭,从而找到问题点。