Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.052 c
2-1167935234
anton773
2007-01-04 21:27
2007.01.21
номер записи


2-1167212791
Elfenit
2006-12-27 12:46
2007.01.21
Помогите открыть RTF


1-1164451803
Шоломицкий С. А.
2006-11-25 13:50
2007.01.21
Проблемы с печатью! Информации нет, помогите!


15-1167295872
Rouse_
2006-12-28 11:51
2007.01.21
Таки скока вы работаете? :)


2-1167476157
ламер 2.Х
2006-12-30 13:55
2007.01.21
Indy




   Наверх