Использует ли Tomcat кэшированные версии модулей pl / sql? - PullRequest
3 голосов
/ 03 февраля 2011

Хорошо, представьте эту ситуацию. Я делаю изменения в модуле pl / sql, перекомпилирую его, и все в порядке. Нет ошибок Затем я пытаюсь получить доступ к экрану графического интерфейса в приложении, которое работает на Tomcat. Экран вызывает модуль pl / sql в базе данных oracle.

Когда я отправляю форму, которая должна была вызвать этот модуль pl / sql для обработки данных, я получаю эту ошибку

ORA-20001: ORA-06508: PL/SQL: could not find program unit being called 

Я проверил все пакеты в $ USER_OBJECTS, и нет статуса со статусом INVALID.

Я перезапустил Tomcat, и он начинает работать. Означает ли это, что когда я перекомпилировал пакет в первый раз, я фактически удалил некоторую кешированную ссылку на пакет, который использовал Tomcat?

Соединение с базой данных осуществляется через пулы соединений JDBC и DBCP. Может ли перекомпиляция сделать недействительным соединение?

Ответы [ 3 ]

4 голосов
/ 03 февраля 2011

Эта проблема связана с пулами соединений JDBC и является проблемой, которую вы получаете со всеми серверами приложений, использующими пулы соединений JDBC, а не только с Tomcat.Пулы соединений будут поддерживать несколько открытых соединений в пуле, готовых к следующему запросу.Если соединение с пакетом PL / SQL было указано и перекомпилировано, то следующий вызов этого пакета вызовет ошибку ORA-06508.Это повлияет на пакеты в любом месте стека вызовов, а не только на пакет, который вы вызвали напрямую.

Для решения этой проблемы некоторые серверы приложений (например, Weblogic) имеют метод тестирования, который вызывается периодически.Если тест не пройден, соединение удаляется из пула или обновляется каким-либо образом.Я не уверен, какой механизм имеет Tomcat.

Еще один способ решить эту проблему - вызвать dbms_session.reset_package в качестве первого вызова метода в вашем вызове JDBC.Это очистит состояние пакета от вашей сессии.Этот подход не рекомендуется, поскольку он снижает производительность, а все переменные в области пакета сбрасываются, поэтому необходимо повторно вызывать блоки инициализации пакета - еще один удар по производительности.

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

2 голосов
/ 03 февраля 2011

Экран вызывает модуль pl / sql в база данных оракула. ​​

Нет, это не так. Предполагая, что вы запускаете веб-приложение на основе сервлета в Tomcat, ваш браузер отправляет запрос в Tomcat, который вызывает соответствующий сервлет, а затем некоторый класс Java в веб-приложении выполняет программу pl / sql как CallableStatement.

Ключом к этому является то, как класс java выполняет CallableStatement и сохраняет ли он ссылку на него или подготавливает его каждый раз, когда выполняет его. Можете ли вы пролить свет на это?

Edit:
Я полагаю, что драйвер Oracle JDBC способен выполнять кэширование операторов, что может быть причиной проблемы. Прочтите документацию по драйверу, чтобы получить больше информации.

0 голосов
/ 03 февраля 2011

Получаемая ошибка обычно указывает на то, что хранимая процедура / пакет либо:

1) не существует по имени, которое вы пытаетесь вызвать (из вашего Java-класса)

2) отсутствует предоставленная привилегия EXECUTE для пользователя (определяемого соединением JDBC), который пытается его выполнить

3) отсутствует синоним, если он выполняется только через свое имя (т.е.без схемы)

4) вызывается без правильного количества и типов параметров

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