2011-09-03 160 views
3

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

现在工作了三天,但没有成功。使用

上传的5个所需的JAR文件,here link,到数据库:这是一步一步我做了什么

loadjava -user scott/[email protected] 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.

使用谷歌,我发现this link(一个类的Java代码,其中有一种方法,完全打印此错误消息),我想我必须使用同步方法,请检查链接,我想你也会发现。

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

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

凯文Vermaat

+0

您需要完整的stacktrace进行取证分析。这听起来像是学习如何检索的好时机。 –

+0

如果您下次登录时,请阅读我对您的回答的评论:) –

+0

我不熟悉Oracle数据库内JVM的更精细的工作方式,并且无法帮助您了解这一点。你可能想要打开一个新的问题,明确地询问,只是为了做到这一点。 –

回答

2

那么,从上面的链接下载jar和示例我将所有东西加载到我的Oracle数据库中,并得到完全相同的错误。即使这个错误肯定是由于同步问题导致的,但我不需要添加任何东西。代码是来自示例的代码,并且没有在哪里找到直接使用“registryBuilder”对象的类中的任何对象。

好吧,它会花很长的时间写详细的一切。所以我会写我执行的步骤来克服加载jar和运行代码时遇到的各种错误。也许执行相同的步骤也会为您解决问题。

1-为用户授予创建表和过程的权限,并增加用户表空间的配额。我会尝试使用您提供的数据作为用户和数据库。给予补助,以SYSDBA身份连接:

sqlplus sys/[email protected] as sysdba 

您连接后,给授予用户斯科特和增加其配额:

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/[email protected] gdata-analytics-2.1.jar gdata-analytics-meta-2.1.jar gdata-core-1.0.jar google-collect-1.0-rc1.jar jsr305.jar 

这是我做的,使其运行我。

+0

谢谢AJ,这确实奏效,非常感谢你付出的所有努力! –

+0

很高兴它做到了。不用客气 :) –

1

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) {....}块你必须有一个锁。尝试把它放在你的代码中。

+0

谢谢。我也读过,但我不知道该把代码放在哪里,你能告诉我在哪里吗?真的非常感谢你的答案!关于stacktrace,您可以在线分享或预订任何教程吗? –

+0

可能围绕代码抛出异常的代码。您可能需要阅读Java中同步块的含义 - 一个好的起点是Oracle Java教程。 –

+0

非常感谢,我会这么做的,我的问题没有完全解答,但是我会定义只是投你的帖子,如果你发现更多的东西,请随时发表评论^^,我也会发布第二个问题。 –