поиск и закрытие вновь открытых курсоров - оракул - PullRequest
0 голосов
/ 12 сентября 2018

Я использую Matlab 2018a для подключения к БД Oracle через JDBC.oracle версия 11.2.

Моя программа - это «движок», который активирует ряд написанных пользователем функций.

Если число функций велико, я могу получить «ORA-01000 max open open»«превышены курсоры».

В настоящее время я решаю эту проблему, закрывая и открывая соединение с БД, но это большое снижение производительности.

Я подумал о том, чтобы получить курсорыдо и после функции и просто закрывая курсоры, которые были открыты с помощью функции, которую я запустил.

Поэтому я извлек таблицы V $ SESSION и V $ OPEN_CURSORS и был удивлен, обнаружив несколько открытых курсоров из моегосессия.

Я не открываю курсоры в явном виде, и функции, которые я запускаю, не открывают курсоры явно, но мы используем функцию, которая выполняет запросы SQL.

Итак:

  1. Как узнать, какие курсоры были открыты функцией, которую я запускал?Есть ли у курсоров уникальные идентификаторы, которые я должен использовать для их различения?
  2. Стоит ли мне смотреть только на открытые курсоры или я должен также беспокоиться о закрытых курсорах?Могут ли они внезапно стать открытыми курсорами?

Спасибо!

1 Ответ

0 голосов
/ 12 сентября 2018

Как узнать, какие курсоры были открыты с помощью функции, которую я запустил?

Итак, приведенный ниже запрос скажет вам, что такое открытые курсоры (вы можете указать username)

select a.value, s.username, s.sid, s.serial#    
from v$sesstat a, v$statname b, v$session s    
where a.statistic# = b.statistic#  and s.sid=a.sid    
and b.name = 'opened cursors current';

Тогда из sid вы можете узнать запрос.

select * from v$sqlarea where sql_id in(
select case when sql_id is null then prev_sql_id else sql_id end  from v$session where sid in (
select  s.sid
from v$sesstat a, v$statname b, v$session s
where a.statistic# = b.statistic#  and s.sid=a.sid
and b.name = 'opened cursors current'
and username='usersomething')
)

Есть ли у курсоров уникальные идентификаторы, которые я должен использовать для их различения?

Хорошо, когда выполняется выбор, курсор открывается, приведенный выше запрос сообщит вам, какие запросы открыли курсор.Существуют 2 типа курсоров: неявный курсор и явный, запустив select 1 из dual, это неявный курсор, который оракул открывает и закрывает его, явный - когда вы объявляете курсор (с select), который вы открываете и закрываете (хорошо, если вы используете for .. in ..loop, он будет закрываться самостоятельно)

(В соответствии с моим пониманием и проведенным тестом, когда вы закрываете соединение, оракул закроет курсоры)

2-Должен ли я смотреть только на открытые курсоры или я должен также беспокоиться о закрытых курсорах?Могут ли они внезапно стать открытыми курсорами?

В указанных выше пределах ошибок, связанных с открытыми курсорами, курсор может быть открыт при повторном выполнении запроса.поэтому вы должны проверить наличие открытых курсоров.

вы можете пропустить эту ошибку ORA-01000 maximum open cursors exceeded, увеличив число курсоров alter system set open_cursors = 400 scope=both (по умолчанию это выглядит как 50 oracle doc)

В этом ответе содержится большое объяснение причин, стоящих за ORA-01000: maximum open cursors exceeded, и некоторых способов его устранения. java.sql.SQLException: - ORA-01000: превышено максимальное количество открытых курсоров

...