Я пытаюсь устранить проблему, которая проявляется в различных ошибках базы данных, таких как, ORA-01000: превышено максимальное количество открытых курсоров или Невозможно создать соединение с БД.Я проверил PLSQL, чтобы определить, оставлены ли курсоры открытыми и все ли закрыты, даже если есть ошибка.
Java-приложение и фон следующие: исходное приложение представляло собой трехуровневую систему:
приложение с графическим интерфейсом.-> серверное приложение -> 11 г база данных Oracle
Усовершенствовано добавление службы API в среду Pivotal Cloud Foundry (PCF).Таким образом, эта архитектура была такой:
Закрыть Функция: приложение GUI -> Приложение сервера -> Служба API -> База данных.
Все остальные функции: приложение GUI -> Приложение сервера -> База данных.
Он запущен в эксплуатацию и работает в течение недели без проблем с базой данных, описанных выше.Затем было добавлено еще одно усовершенствование, в котором служба API взаимодействует с несколькими другими службами в PCF, в которых 2 взаимодействуют с одной и той же базой данных Oracle.Сейчас во время большого объема мы получаем эти ошибки базы данных.
Мне кажется, что база данных Oracle не может справиться с запросами от этих дополнительных сервисов.Но как я могу продемонстрировать это?Мы настроили AppD для серверов, но не для базы данных.Есть ли запросы, которые я могу запустить в prod env.что показывает, что эти приложения PCF вызывают проблему?Или я должен искать в другой области?
Спасибо,
ОБНОВЛЕНИЕ Я посмотрел на унаследованное приложение, и наборы результатов закрыты.Другие 3 приложения PCF используют Spring Boot для подключения к базе данных.Насколько я понимаю, закрывающие соединения и наборы результатов не должны быть явно закрыты.JDBCTemplate закрывает эти соединения / наборы результатов.У добавленного PLSQL есть дополнительный курсор, который закрывается при успешном завершении и исключении.
UPDATE Я создал запрос, который показывает общий открытый курсор по sessionID. Это запрос:
select b.sid, b.username, b.osuser, sum(a.value) total_opened_current_cursors
from sys.v_$statname c,
sys.v_$sesstat a,
sys.v_$session b
where a.statistic#=c.statistic# and
b.sid=a.sid and
c.name in ('opened cursors current') and
(b.username is not null or b.username <> '' )
group by b.sid, b.username, b.osuser
order by total_opened_current_cursors desc
Теперь мне нужно связать sessionID с приложением, которое имеет этот сеанс. osuser для верхних NULL.Кроме того, большинство сессий имеют статус НЕАКТИВНО Как определить приложение для сеанса?Во-вторых, является ли сеанс неактивным, что, как я думал, означает, что никакой запрос не происходит, так почему существуют открытые курсоры?
**UPDATE**
Итак, я написал запрос, который возвращает первые 10 сеансов с самыми высокими открытыми курсорами.
select *
FROM
(
select b.sid, b.username, b.osuser, b.status, sum(a.value) total_opened_current_cursors
from sys.v_$statname c,
sys.v_$sesstat a,
sys.v_$session b
where a.statistic#=c.statistic# and
b.sid=a.sid and
c.name in ('opened cursors current') and
(b.username is not null or b.username <> '' )
group by b.sid, b.username, b.osuser, b.status
order by total_opened_current_cursors desc
)
WHERE ROWNUM <= 10;
Я нашел SQL_TEXT, который учитывает большинство открытых курсоров ... на сегодняшний день!(87%) Итак, как мне найти запрос, который вызывает этот SQL?Есть как минимум 5 сервисов, попавших в базу данных.Некоторые сервисы вызывают хранимые процедуры PLSQL, некоторые вызывают текст SQL.Запрос, который учитывает открытые курсоры, указан как оператор SELECT .Означает ли это, что это НЕ хранимая процедура?Или можно SELECT вызываться в хранимых процедурах.
Как найти соединение, использующее этот сеанс?