Обычно вы бы помещали операторы close для вашего ResultSet и Statement в блок finally
, чтобы гарантировать, что они вызываются, даже если возникает исключение (может быть проблема, которая у вас возникла здесь). В вашем текущем коде, если возникает SQLException, тогда два вызова метода close () никогда не произойдут, а курсоры останутся открытыми.
Кроме того, какой запрос вы используете в Oracle для просмотра количества открытых курсоров?
Edit:
Этот код должен закрывать курсор. Если это не так, то вы сможете увидеть соотношение вызовов и методов при вызове вашего метода 1: 1, увеличивая на 1. Удостоверьтесь, что нет какого-то неожиданного процесса, вызывающего увеличение количества курсоров.
Если у вас есть права, вы можете выполнить этот запрос к базе данных, чтобы увидеть количество открытых курсоров по sid, чтобы увидеть, может быть, это какой-то другой процесс, который увеличивает курсоры, а не ваш конкретно. Он откроет любой с более чем 10 открытыми курсорами, вы можете увеличить его, чтобы отфильтровать шум или сузить его по имени пользователя или osuser:
select oc.sid,
count(*) numCur,
s.username username,
s.osuser osuser,
oc.sql_text,
s.program
from v$open_cursor oc,
v$session s
where s.sid = oc.sid
group by oc.sid,
oc.sql_text,
s.username,
s.osuser,
s.program
having count(*) > 10
order by oc.sid;
Еще один запрос, который может быть полезен в случае, если несколько sid используют одну и ту же строку запроса, поэтому вышеприведенное плохо раскрывает нарушителя:
select oc.sql_text, count(*)
from v$open_cursor oc
group by oc.sql_text
having count(*) > 10
order by count(*) desc;