Получение java.sql.SQLException: ORA-04031: - PullRequest
0 голосов
/ 18 января 2010

Я получаю следующее, когда запрос выполняется через веб-приложение

java.sql.SQLException: ORA-04031:
java.sql.SQLException: ORA-04031: unable to allocate 48784 bytes of shared memory ("shared pool","SELECT   emplid levempid, '2...","Typecheck","qry_text : qcpisqt")

Но тот же запрос выполняется через TOAD правильно.

Ответы [ 3 ]

8 голосов
/ 30 января 2010

Скорее всего, ваш Java-код не использует переменные связывания. В этом случае каждый оператор SQL является уникальным и не будет использоваться повторно, что приведет к превышению общего пула. Это станет фрагментированным и в конечном итоге приведет к ORA-04031.

Перезапуск базы данных будет работать только временно, но в конечном итоге вы столкнетесь с такими же проблемами. Увеличение размера общего пула и регулярный перезапуск базы данных не являются реальным решением. Единственное реальное решение - переписать ваш SQL для использования переменных связывания.

Вот ветка AskTom, в которой кто-то испытывает нечто подобное: http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:528893984337

В этой теме можно найти симпатичную небольшую программу для отслеживания того, какие операторы SQL не используют переменные связывания:

Надеюсь, это поможет.

С уважением, Роб.

2 голосов
/ 18 января 2010

Найден похожий вопрос на форуме оракула , и решение, которое, похоже, работает:

У пользователя не было server=dedicated в его записи tnsnames. Добавление этой строки в заставило запрос работать.

Надеюсь, это поможет.

1 голос
/ 05 февраля 2010

В metalink они заявляют это как:

Ошибка ORA-04031 обычно возникает из-за фрагментации в кэше библиотеки или зарезервированного пространства общего пула.Прежде чем увеличивать размер общего пула, подумайте о настройке приложения для использования совместно используемого sql и настройки SHARED_POOL_SIZE, SHARED_POOL_RESERVED_SIZE и SHARED_POOL_RESERVED_MIN_ALLOC.Сначала определите, был ли ORA-04031 результатом фрагментации в кэше библиотеки или в зарезервированном пространстве общего пула, выполнив следующий запрос:

SELECT free_space, avg_free_size, used_space, avg_used_size, request_failures, last_failure_size FROM v $shared_pool_reserved;ORA-04031 является результатом отсутствия смежного пространства в зарезервированном пространстве общего пула, если: REQUEST_FAILURES равен> 0, а LAST_FAILURE_SIZE равен> SHARED_POOL_RESERVED_MIN_ALLOC.

Чтобы решить эту проблему, рассмотрите возможность уменьшения числа объектов SHARED_POOL_RESERVED_POOL_RESERVED_ дов зарезервированное пространство общего пула и увеличьте значения SHARED_POOL_RESERVED_SIZE и SHARED_POOL_SIZE, чтобы увеличить доступную память в зарезервированном пространстве общего пула.

ORA-04031 является результатом нехватки непрерывного пространства в кеше библиотеки, если:

REQUEST_FAILURES равно> 0, а LAST_FAILURE_SIZE равно

или

REQUEST_FAILURES равно 0, а LAST_FAILURE_SIZE равно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...