powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему висят открытые курсоры?
18 сообщений из 18, страница 1 из 1
Почему висят открытые курсоры?
    #39942496
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Есть функция в оракловом пакете
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
function mop_isua_0(p_aid number) return number is
    cursor CheckAtom is
      select 1
        from dual
       where exists (select null
                from mop_rights_ r
               where r.uname = user
                 and r.a_id = p_aid);
    l_ret number(1) := 0;
  begin
    open CheckAtom;
    fetch CheckAtom
      into l_ret;
    close CheckAtom;
    return nvl(l_ret, 0);
  end mop_isua_0;


Есть модуль в Delphi, который отвечает за связь с БД и в нем вызов функции (она на всех формах вызывается):
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
function TPkMop.CheckRights(PAtomID: Integer): Integer;
begin
  GetStoreProc; //инициализация TOraStoredProc
  StoredProc.StoredProcName := 'FGV0.MOP.MOP_ISUA_0';
  StoredProc.Prepare;
  StoredProc.ParamByName('p_aid').AsInteger := PAtomID;
  StoredProc.Execute;
  Result := StoredProc.ParamByName('RESULT').Value;
end;


При запуске АРМа хожу по формам, делаю разные действия, через какое-то время
вылетает ошибка превышения кол-ва открытых курсоров.
Возникает вопрос: я ведь закрыл курсор еще в пакете, почему он остается висеть в открытых?
В v$open_cursor вызов представлен как
Код: plsql
1.
begin   :RESULT := FGV0.MOP.MOP_ISUA_0(:P_AID); end;


Как мне закрыть его? Ни Commit, ни Rollback не помогают.
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942583
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

имхо
причина в чем-то другом (не в mop_isua_0)
напр где-то есть рекурсивный вызов, или в цикле dbms_sql наоткрывал

оракл не сразу закрывает курсор (по крайней мере в древних версиях)
можна проверить напр на
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
  1  declare
  2      cursor CheckAtom is
  3        select 1 /* TEST789 */
  4          from dual
  5         where exists (select null
  6                  from emp e
  7                 where deptno=20);
  8      l_ret number(10) := 0;
  9  begin
 10      open CheckAtom;
 11      fetch CheckAtom
 12        into l_ret;
 13      close CheckAtom;
 14      select count(*) into l_ret from v$open_cursor where SQL_TEXT like '%TEST789%';
 15      dbms_output.put_line(l_ret);
 16* end;
SQL> /
1



ps
nvl(l_ret, 0); nvl лишний
.....
stax
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942585
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подозреваю, что если в Delphi коде есть "инициализация", то должна быть еще и операция "ДЕинициализация" (как минимум закрытие курсора)
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942597
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Подозреваю, что если в Delphi коде есть "инициализация", то должна быть еще и операция "ДЕинициализация" (как минимум закрытие курсора)

Наскоко я понял речь идет о вызове ф-ции

в ф-ции курсор закрывается явно,
даж если бы не было close CheckAtom; он бы "закрылся" при выходе из зоны видимости

я к тому многократный вызов ф-ция mop_isua_0 не должен приводить к "превышения кол-ва открытых курсоров" (ora-1000)

зы
в принципе ж легко проверить
вызвать mop_isua_0 в цыкле делфи больше чем макс-опен-курсор

....
stax
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942601
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stax

Наскоко я понял речь идет о вызове ф-ции

Вызов это в любом случае Statement или PreparedStatement (в терминологии Java)

Если statement'ы не закрывать, то понятно, что открытые курсоры будут плодиться

Код: pascal
1.
2.
3.
  GetStoreProc; //инициализация TOraStoredProc
...
  StoredProc.Execute;
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942607
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,

зря набрал огромную простыню и стер

прикинул, мож с точки зрения оракля "Statement" могут выглядеть как курсоры,
и "ДЕинициализация" их закроет


....
stax
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942640
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ситуация разрешилась (не знаю, временно ли или нет).
При уничтожении компонента StoredProc я делал
Код: pascal
1.
StoredProc := nil;


Видно, что-то шло не так и курсоры оставались жить.
Когда заменил на
Код: pascal
1.
FreeAndNil(StoredProc);


то всё заработало как надо.
Единственный минус этой конструкции применимо к компонентам ODAC,
это то что после использования сторонних dll вылетает ошибка "Assertion failure".
Сейчас сделал костыль такого вида:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
procedure TPkMop.GetStoreProc;
begin
  try
    if Assigned(StoredProc) then
      FreeAndNil(StoredProc);
  except
    on E: Exception do
      StoredProc := nil;
  end;
  StoredProc := TOraStoredProc.Create(nil);
  StoredProc.AutoCommit := False;
  StoredProc.Session := Session;
end;


Вроде работает...

Вопрос можно считать закрытым.
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942647
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийЕдинственный минус этой конструкции применимо к компонентам ODAC,
это то что после использования сторонних dll вылетает ошибка "Assertion failure".

то есть ты время жизни объекта не контролируешь, память у тебя течёт и портится, но это
всё фигня пока Оракул не выдаёт ошибки. По-моему, время перейти с Дельфи на Яву или С#.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942649
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если компонент - это компонент на форме, то вообще не понятно, зачем его руками создавать/уничтожать. Delphi не знаю, сталкивался с ним лет 15 назад.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942651
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, время перейти с Дельфи на Яву или С#.
Только хуже будет.

В Java вообще нет диструкторов, т.ч. resource leak отследить еще сложнее, чем в Delphi. Есть try with resource но IMHO это костыль. Не всегда им можно воспользоваться и код начинает выглядеть многобуквенно.

IMHO
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942654
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПри уничтожении компонента StoredProc я делал
StoredProc := nil;
Это НЕ уничтожение компонента. Это просто потеря ссылки на него, объект остается в памяти.

Делай
Код: pascal
1.
2.
StoredProc.Free;
StoredProc := nil;

или
Код: pascal
1.
FreeAndNil( StoredProc );
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942665
Правильный Вася
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще все вот эти танцы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  try
    if Assigned(StoredProc) then
      FreeAndNil(StoredProc);
  except
    on E: Exception do
      StoredProc := nil;
  end;

можно спокойно заменить на
Код: pascal
1.
FreeAndNil( StoredProc );


Эта процедура и так всё это внутри делает сама.
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942738
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный Вася

Эта процедура и так всё это внутри делает сама.


22108946

авторЕдинственный минус этой конструкции применимо к компонентам ODAC,
это то что после использования сторонних dll вылетает ошибка "Assertion failure".

.....
stax
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942744
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

время жизни я как раз контролирую, это все зашито в процедуре GetStoreProc
Компонент создается динамически, используется более чем в 200 процедурах и функциях.\
Создание, очищение и своевременное освобождение протестировано жизнью.

Переходить на другие языки смысла не вижу.
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942745
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильный Вася
И вообще все вот эти танцы
Код: pascal
1.
2.
3.
4.
5.
6.
7.
  try
    if Assigned(StoredProc) then
      FreeAndNil(StoredProc);
  except
    on E: Exception do
      StoredProc := nil;
  end;

можно спокойно заменить на
Код: pascal
1.
FreeAndNil( StoredProc );


Эта процедура и так всё это внутри делает сама.


Она так и работала, пока не налетел на баг ODACа по работе с dll-ками
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942790
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийСоздание, очищение и своевременное освобождение протестировано жизнью.

Угу, ты уже говорил про "освобождение присваиванием nil".
Жизнь можешь засунуть куда подальше, на обнаружение утечек используются специализированные
инструменты класса FastMM или DrMemory.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942791
ma1tus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий
Она так и работала, пока не налетел на баг ODACа по работе с dll-ками

Обновись до версии >= 9.6.21 и передавай в dll коннект к бд вместо объекта StoredProc
...
Рейтинг: 0 / 0
Почему висят открытые курсоры?
    #39942975
andreymx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Глобальные переменные зло
ТС убедился на своём опыте
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Почему висят открытые курсоры?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]