Форум: "Базы";
Текущий архив: 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.51 MB
Время: 0.042 c