Oracle Java хранимая процедура - PullRequest
3 голосов
/ 03 сентября 2011

Я пытаюсь создать хранимую процедуру Java в Oracle 11g, которая извлекает информацию из Google Analytics.

Работаю над этим уже три дня, но безуспешно. Вот шаг за шагом, что я сделал:

Загрузил 5 необходимых файлов JAR, здесь ссылка , в базу данных, используя:

loadjava -user scott/tiger@WH01 gdata-analytics-2.1.jar

Затем я создал исходный файл Java (в IDE разработчика pl / sql) и использовал пример кода по ссылке выше. Скомпилировал (f8) и он появился в дереве классов Java (то же самое для классов, созданных с помощью файлов jar).

После того, как я написал процедуру вызова класса java:

create or replace procedure KEVIN_PROCEDURE_ANALYTICS AS LANGUAGE JAVA NAME 'Kevin_Analytics.main(java.lang.String[])';

Наконец я вызываю процедуру:

exec KEVIN_PROCEDURE_ANALYTICS();

и я получаю ошибку:

ORA-29532: Java call terminated by uncaught Java exception: java.lang.IllegalStateException: Cannot call dirty() without holding the lock on the registry.

Используя Google, я нашел эту ссылку (Java-код класса, где есть метод, который точно печатает это сообщение об ошибке), и я решил, что мне пришлось использовать синхронизированный метод, пожалуйста, проверьте ссылку и я думаю, что вы тоже узнаете.

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

Спасибо за чтение этого поста, пожалуйста, если кто-то может мне помочь, он будет очень признателен.

Кевин Вермаат

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Что ж, загружая файлы jar и пример по ссылке выше, я загрузил все в свою базу данных Oracle и получил точно такую ​​же ошибку. Хотя ошибка связана с проблемой синхронизации, добавить мне нечего. Код - это код из примера, и я не нашел непосредственного использования объекта «registryBuilder» для какого-либо объекта из класса.

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

1 - предоставить пользователю права на создание таблиц и процедур, а также увеличить свою квоту на табличное пространство пользователей. Я постараюсь использовать предоставленные вами данные для пользователя и базы данных. Чтобы дать гранты, подключитесь как sysdba:

  sqlplus sys/password@WH01 as sysdba 

после того, как вы подключитесь, предоставьте гранты пользователю scott и увеличьте его квоту:

  grant create any table to scott;

  grant create any procedure to scott;

  alter user scott quota unlimited on users;

(и, пожалуйста, проконсультируйтесь с вашим администратором базы данных по поводу вышеизложенного, поскольку может быть нецелесообразно предоставлять неограниченные гранты, как я сделал из-за лени)

2 - теперь снова загрузите файлы. Я загружаю все 5 банок одновременно. также добавьте опцию -f и -genmissing к вашей команде, так как без них это не сработало:

loadjava -genmissing -f -user scott/tiger@WH01 gdata-analytics-2.1.jar gdata-analytics-meta-2.1.jar gdata-core-1.0.jar google-collect-1.0-rc1.jar jsr305.jar

это то, что я сделал, чтобы он работал для меня.

1 голос
/ 03 сентября 2011

От javadoc до метода, который вы нашли:

 /**
   * Dirty this builder.  Whoever is modifying this builder must also hold
   * onto this builder's lock while modifying it, by using a
   * {@code sychronized(registryBuilder) ...} block, or this method will throw
   * an {@link IllegalStateException}.
   */

Он говорит, что у вас должна быть блокировка на блокировке строителей, если она внутри synchronized(registryBuilder) {....} блока.Попробуйте поместить это в свой код.

...