Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];

Вниз

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

 
Сатир   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.5 MB
Время: 0.044 c
2-1167314120
Sn
2006-12-28 16:55
2007.01.21
Подсчет слов совпадающих с данным в текстовом файле


11-1144151482
BaryVetaL
2006-04-04 15:51
2007.01.21
Новый компонент BVLedNumber


2-1167907618
HaJik
2007-01-04 13:46
2007.01.21
Путь к EXE


15-1166810910
RL69
2006-12-22 21:08
2007.01.21
Блокнот


8-1144257990
suharew
2006-04-05 21:26
2007.01.21
Запись экрана монитора





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский