Каква настройка на Oracle предотвратява затварянето на отворените курсори?

Имам две инсталации на Oracle 11G. Мога да стартирам скрипт, който импортира 37MB база данни в един от тях без проблеми (инсталация A). В другата (инсталация B), когато стартирам абсолютно същия скрипт с абсолютно същия файл, той получава "ORA-01000: максимално отворените курсори са надвишени". Увеличих максималния брой отворени курсори до 20 000, но когато скриптът стигне до ред 20 000, той спира със същата грешка ORA-01000. Инсталацията, която работи, има максимален брой отворени курсори, зададени на 300.

Очевидно няма проблем със скрипта или SQL, защото работи в една база данни на Oracle. Така че трябва да има настройка в другия екземпляр на Oracle, която предотвратява затварянето на отворените курсори. Какво може да бъде?

Инсталация А работи. База данни = Oracle Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64-битово производство с опциите за разделяне, OLAP, извличане на данни и тестване на реални приложения. Драйвер = Oracle JDBC драйвер 11.2.0.1.0.

Инсталация B не работи. База данни = Oracle Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64-битова продукция с опциите за разделяне, автоматично управление на съхранението, OLAP, извличане на данни и тестване на реални приложения. Драйвер = Oracle JDBC драйвер 11.2.0.3.0.


person Rubicksman    schedule 28.11.2013    source източник
comment
Мисля, че въпросът трябва да бъде: Защо Oracle отваря нов курсор за (очевидно) всеки запис? Можете да сравните всички параметри на Oracle с този изглед SELECT * FROM V$PARAMETER. Разгледайте параметъра на Oracle cursor_sharing   -  person Wernfried Domscheit    schedule 28.11.2013
comment
Здравейте, можете ли да опишете как успяхте да разрешите този проблем. Това ще бъде от голяма полза. ние също сме в подобна ситуация. Благодаря предварително.   -  person Ajai Gopal    schedule 25.09.2015
comment
Мина много време. Не помня как се реши.   -  person Rubicksman    schedule 16.12.2015


Отговори (1)


Бих препоръчал да проверите кои курсори са отворени в сесия. Ако видите 10 000 твърдения, всички еднакви, с отворени курсори, има нещо нередно в кода.

Аз самият намирам най-лесния начин да направя това:

connect sys

alter system flush shared_pool; /* Removes everything can be finished, the trees hinder my view of the forest. */

/* Overall overview. */
select *
from v$sqlarea

/* Open cursors per session. */

select *
from v$open_cursor
person Guido Leenders    schedule 28.11.2013