#java #oracle10g
#java #oracle10g
Вопрос:
Мы используем ORACLE A.S 10g и D.B 10g (10.0.1). Мы поддерживаем пул DB-соединений на A.S. Наше приложение основано на веб-интерфейсе. Мы правильно закрываем результирующий набор и инструкцию на стороне Java. Но мы часто получаем сообщение об ошибке «Превышено значение открытого курсора». В настоящее время на производстве мы установили ограничение на 5000. Мы используем следующий запрос для проверки текущего открытого курсора
select a.sid, a.value, b.name, b.statistic#
from v$sesstat a, v$statname b
where a.statistic# = b.statistic#
and b.name = 'opened cursors current'
and a.sid = 555(any sid number)
Количество ‘открытых курсоров’ увеличивается, его нельзя уменьшить, пока мы не перезапустим наш сервер приложений.
Потому что мы используем пул соединений, поэтому курсоры не закрыты?
Пожалуйста, подскажите нам, что нам следует делать. Какие еще области мы рассмотрим.
Комментарии:
1. Вы также закрываете соединение? ( вы упоминаете только набор результатов и инструкцию)
2. он сказал, что у них есть пул соединений
3. Но он не сказал, что закрыл соединения, используя connection.close(), который возвращает соединение обратно в пул.
4. Если ваше приложение переносимое, я бы попробовал с другого сервера приложений, чтобы вы знали, связана ли проблема с кодом или с конфигурацией A.S.
Ответ №1:
для поиска повторных нарушителей:
select c.SQL_TEXT, count(*) cnt
from v$open_cursor c
group by c.SQL_TEXT
order by cnt desc
Ссылочные курсоры, которые возвращаются хранимыми процедурами / функциями, также должны быть закрыты.