【问题标题】:Oracle java stored procedureOracle java存储过程
【发布时间】:2011-09-03 12:23:58
【问题描述】:

我正在尝试在 Oracle 11g 中创建一个 Java 存储过程来检索 Google Analytics 信息。

现在为此工作了三天,但没有成功。这是我所做的一步一步:

使用以下命令将 5 个所需的 JAR 文件 here link 上传到数据库:

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

然后我创建了 java 源文件(在 pl/sql 开发人员 IDE 中)并使用了上面链接中的示例代码。编译它(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 我找到了this link(一个类的 java 代码,其中有一个方法可以准确地打印此错误消息),我认为我必须使用同步方法,请检查链接,我想你会的也可以了解一下。

现在的问题是,我真的不知道我必须如何以及在哪里放置这个同步代码。如果你们中的某个人可以告诉我这个,我会是真的。

感谢您阅读这篇文章,如果有人可以帮助我,将不胜感激。

凯文·维尔马特

【问题讨论】:

  • 您需要完整的堆栈跟踪来进行取证分析。这听起来是学习如何检索它的好时机。
  • 如果您下次登录时有时间,请阅读我对您的回答的评论:)
  • 我不熟悉 Oracle 数据库中 JVM 的精细工作,无法帮助您了解这一点。您可能想打开一个新问题,明确询问如何做到这一点。

标签: java oracle stored-procedures gdata


【解决方案1】:

嗯,从上面的链接下载 jars 和示例,我将所有内容加载到我的 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;

(请就上述问题咨询您的 DBA,因为它可能不适合像我出于懒惰那样提供无限制的赠款)

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

这是我为让它运行而做的。

【讨论】:

  • 感谢 AJ,这确实有效,非常感谢您为此付出的所有努力!
【解决方案2】:

从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}.
   */

它说你必须在 builder 锁上加一个锁,方法是把它 放在 synchronized(registryBuilder) {....} 块中。试着把它放在你的代码周围。

【讨论】:

  • 谢谢。我也确实读过,但我不知道将它放在代码中的哪个位置,你能告诉我在哪里吗?真的谢谢你的回答!关于stacktrace,有什么在线教程可以分享或预订吗?
  • 可能围绕着抛出异常的代码所在的代码。您可能想了解 Java 中同步块的含义——一个很好的起点是 Oracle Java 教程。
  • 非常感谢,我会的也发布第二个问题。
猜你喜欢
  • 2013-07-15
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2011-12-29
相关资源
最近更新 更多