Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

Закрытие неявного курсора в Оракле   Найти похожие ветки 

 
Сатир   (2006-10-24 17:13) [0]

Как закрыть неявный курсор в Оракле, после закрытия связанного с ним датасета?

в оракле есть пакет, из которого вызывается такая процедура
Procedure P_Get_Dict(
         p_Sql_Id In Number,
         p_Sql_Par In Clob,
         p_Sql Out TRef_Cursor
         );
где   Type TRef_Cursor is Ref Cursor;  
В Delphi на форме установлен TOracleDataSet, в котором вызывается эта процедура:
begin
 -- call procedure
 ERP.PKG_APPLICATION.P_Get_Dict(:P_SQL_Id,:P_SQL_PAR, P_SQL =>:CUR);
end;
после закрытия этого датасета
если выполнить запрос на предмет открытых курсоров
Select *
From V$open_Cursor t
Where upper(t.sql_text) Like upper("%v_shop%")
то получим наш открытый курсор.
Вопрос: как его можно закрыть?


 
Desdechado ©   (2006-10-24 17:27) [1]

C какой целью?
Оракл кэширует курсоры на случай их повторной надобности, чтоб потом не выполнять.
Можешь попробовать изменить контекст сессии, это, говорят, закрывает кэшированные курсоры.
Но смысла не вижу.


 
Сатир   (2006-10-24 17:47) [2]

Да, после закрытия сессии, курсор закрывается.
Но в базе может стоять ограничение на кол-во открытых курсоров, поэтому нужно закрывать неиспользуемые.


 
Reindeer Moss Eater ©   (2006-10-24 17:53) [3]

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

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


 
Сатир   (2006-10-24 18:14) [4]

уже сделал.
если кому интересно , в хелпе по ДОА ссылка на статью
Using a cursor variable as a TOracleQuery


 
Сатир   (2006-10-25 11:07) [5]


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

Вчера прочитал в книжке по Ораклу, что открытие неявных курсоров тоже вносит свой вклад на достижение предельного количества открытых курсоров, устанавливаемого системой.
Так что, неявные курсоры тоже нужно закрывать.


 
Sergey13 ©   (2006-10-25 11:10) [6]

> [5] Сатир   (25.10.06 11:07)

ИМХО, эта проблема имеет номер приоритета 216 в списке решаемых проблем. И решается она сменой параметра в ini файле.


 
Сатир   (2006-10-26 15:49) [7]


> эта проблема имеет номер приоритета 216 в списке решаемых
> проблем

а у моего руководства эта проблемма имела номер приоритета 1 в списке решаемых проблем.)

> И решается она сменой параметра в ini файле.

может тогда подскажешь имя этого параметра, раз уж заикнулся?


 
Sergey13 ©   (2006-10-26 15:57) [8]

> [7] Сатир   (26.10.06 15:49)

> а у моего руководства эта проблемма имела номер приоритета 1 в списке решаемых проблем.)
Это проблема твоего руководства. 8-)

> может тогда подскажешь имя этого параметра, раз уж заикнулся?
open_cursors как нетрудно догадаться. 8-)


 
evvcom ©   (2006-10-26 15:58) [9]

> [7] Сатир   (26.10.06 15:49)
> а у моего руководства эта проблемма имела номер приоритета 1

Интересно, а что руководство выполняло запрос
> [0] Сатир   (24.10.06 17:13)
> Select *
> From V$open_Cursor t
> Where upper(t.sql_text) Like upper("%v_shop%")

??? Уж больно продвинутое у вас руководство!


 
Сатир   (2006-10-26 16:04) [10]


> Это проблема твоего руководства. 8-)

некоторые проблеммы моего руководства - мои проблеммы, пока я работаю под началом этого руководства.:)

> open_cursors как нетрудно догадаться. 8-)

ты предлагаешь увеличить допустимое количество открытых курсоров?;)

> Уж больно продвинутое у вас руководство!

на этом вся продвинутость и заканчивается. гг


 
Reindeer Moss Eater ©   (2006-10-26 16:08) [11]

а у моего руководства эта проблемма имела номер приоритета 1 в списке решаемых проблем.)

Проблема эта, если она имеет такой приоритет, решается покупкой памяти для сервера.


 
Сатир   (2006-10-26 16:14) [12]


> решается покупкой памяти для сервера.

а почему уже тогда сразу не покупкой нового сервера?(ещё одного, чтобы распределить нагрузку)


 
Sergey13 ©   (2006-10-26 16:27) [13]

2 [10] Сатир   (26.10.06 16:04)
> ты предлагаешь увеличить допустимое количество открытых курсоров?;)
Можно еще юзеров отсекать или ограничивать их активность. 8-)
Каждый запрос рождает неявный курсор.


 
Reindeer Moss Eater ©   (2006-10-26 17:03) [14]

а почему уже тогда сразу не покупкой нового сервера?(ещё одного, чтобы распределить нагрузку)

Можно сразу и сервера.

Отчего ограничение на открытые курсоры?
От жадности что ли?
Нет.
От того, что нехватает ресурсов.
А почему не хватает имеющихся ресурсов?
Потому что активность клиентов высокая.

Какой вывод?


 
Petr V.Abramov   (2006-10-26 22:20) [15]

курсоры надо за собой закрывать, так же, как закрывать за собой файлы и дергать ручку унитаза в определенных ситуациях
> Сатир   (24.10.06 17:13)  
 как его закрыть, можно узнать только из документации по Вашим компонентам доступа

проблема в том, что init-ora у всех свой, если база не уникально-корпоративная

> Desdechado ©   (24.10.06 17:27) [1]
кешируется текст запросов и план, и совсем в другом месте, чем отжираетсся память на открытые курсоры (не зря ж параметр max_open_cursors придуман)


 
evvcom ©   (2006-10-27 09:08) [16]

> [15] Petr V.Abramov   (26.10.06 22:20)
> кешируется текст запросов и

А текст ли? AFAIK, вычисляется хеш запроса, и текст больше не хранится. У новых запросов опять вычисляется хеш и сравнивается с уже посчитанными ранее. Если есть такой хеш, то берется уже известный план, если нет такого хеша, строится план для этого нового запроса.


 
Sergey13 ©   (2006-10-27 09:21) [17]

> [16] evvcom ©   (27.10.06 09:08)
> А текст ли? AFAIK, вычисляется хеш запроса, и текст больше
> не хранится.
Тогда что я вижу, глядя на вывод запроса (например)

SELECT sql_text  FROM v$open_cursor

?


 
evvcom ©   (2006-10-27 09:31) [18]

> [17] Sergey13 ©   (27.10.06 09:21)

Любой запрос берет данные из таблиц. Текст запроса записывается системой в таблицу, но это вовсе не означает, что он (текст) также остается и в кеше. В кеше остаются ключи, тот же хеш, например. Я не настаиваю на верности того, что сказал, потому и писал AFAIK. В общих чертах об этом говорили мне на курсах, что-то я домыслил сам. Про хранение текста в кеше не помню, чтобы говорили, но про вычисление и хранение хеша точно было.


 
Petr V.Abramov   (2006-10-27 10:51) [19]

> evvcom ©   (27.10.06 09:08) [16]
текст тоже
хеш-то он на то и хеш, что по определению дает неоднозначное совпадение, хоть и "примерно хорошее"
> Текст запроса записывается системой в таблицу
 не записывается :))) V$-представления основаны неких x$-таблицах, а они являются отображением структур памяти инстанса, нету их даже в словаре


 
evvcom ©   (2006-10-27 14:11) [20]

> [17] Sergey13 ©   (27.10.06 09:21)
> [19] Petr V.Abramov   (27.10.06 10:51)

Ну пусть будет так. В админские дебри я пока особо не залазил. :)


 
Petr V.Abramov   (2006-10-27 21:36) [21]

Удалено модератором
Примечание: Эмоциональность приведет к бану


 
Petr V.Abramov   (2006-10-27 21:36) [22]

пардон за эмоциональность


 
evvcom ©   (2006-10-30 08:41) [23]

у... боюсь... >(8-o)
ладно, остынь...
А то, что база тормозит, значит вина разработчика, это % на 99 согласен. Я в таких случаях никогда на наших админов не грешу.


 
Сатир   (2006-11-01 12:39) [24]


> как его закрыть, можно узнать только из документации по
> Вашим компонентам доступа

Уже узнал.
Для компонентов типа TOracleDataSet из пакета DOA нужно вызывать метод CloseAll. Он-то и закрывает связанный с данным датасетом открытый неявный курсор. А вот метод Close просто закрывает датасет, а сам курсор оставляет открытым.



Страницы: 1 вся ветка

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.059 c
4-1155585641
maxistent
2006-08-15 00:00
2007.01.21
Как получить данные из чужого контрола?


2-1168065288
Igor_Z
2007-01-06 09:34
2007.01.21
Обрезка файла


11-1144318313
Dodfr
2006-04-06 14:11
2007.01.21
MHFontDialog return bad font height


2-1167225102
Гульназ
2006-12-27 16:11
2007.01.21
У меня база не работает, как восстановить?


2-1167328333
Juri
2006-12-28 20:52
2007.01.21
Рабочий стол