Oracle java存储过程
我试图在Oracle11g中创建一个Java存储过程,用于检索Google分析信息 这项工作已经进行了三天,但没有成功。下面是我一步一步做的: 使用以下方式将5个必需的JAR文件上载到数据库:Oracle java存储过程,java,oracle,stored-procedures,gdata,Java,Oracle,Stored Procedures,Gdata,我试图在Oracle11g中创建一个Java存储过程,用于检索Google分析信息 这项工作已经进行了三天,但没有成功。下面是我一步一步做的: 使用以下方式将5个必需的JAR文件上载到数据库: loadjava-用户scott/tiger@WH01gdata-analytics-2.1.jar 然后我创建了java源文件(在pl/SQLDeveloperIDE中),并使用了上面链接中的示例代码。编译它(f8),它出现在Java类树中(与使用jar文件创建的类相同) 在我编写了调用java类的过程
loadjava-用户scott/tiger@WH01gdata-analytics-2.1.jar
然后我创建了java源文件(在pl/SQLDeveloperIDE中),并使用了上面链接中的示例代码。编译它(f8),它出现在Java类树中(与使用jar文件创建的类相同)
在我编写了调用java类的过程之后:
创建或替换程序KEVIN\u程序\u分析
作为JAVA语言
名称为“Kevin_Analytics.main(java.lang.String[])”代码>
最后,我把这个过程称为:
exec KEVIN_PROCEDURE_ANALYTICS()代码>
我得到了一个错误:
ORA-29532:Java调用被未捕获的Java异常终止:Java.lang.IllegalStateException:在不持有注册表锁的情况下无法调用dirty()。
使用google我找到了(一个类的java代码,其中有一个方法可以准确地打印这个错误消息),我想我必须使用一个同步的方法,请检查链接,我想你也会发现的
现在的问题是,我真的不知道如何以及在哪里我必须把这个同步的代码。如果你们中有人能给我看这个,我会非常高兴的
谢谢你阅读这篇文章,如果有人能帮助我,我将不胜感激
Kevin Vermaat从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){..}
块中。试着把它放在你的代码中。好吧,从上面的链接下载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;
(请咨询您的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
这就是我所做的,让它为我运行。您需要完整的stacktrace进行法医分析。这听起来是学习如何检索的好时机。如果您下次登录时有时间,请阅读我对您答案的评论:)我不熟悉Oracle数据库中JVM的更精细的工作方式,无法帮助您找到这一点。你可能想打开一个新的问题,明确地问,并且只问如何做到这一点。谢谢。我也读过,但我不知道该把它放在代码里的什么地方,你能告诉我在哪里吗?非常感谢你的回答!关于stacktrace,您可以在线共享或预订任何教程?可能是关于引发异常的代码。您可能想阅读一下同步块在Java中的含义-Oracle Java教程是一个很好的起点。非常感谢,我会这样做,我的问题没有完全回答,但我会肯定地投票支持您的帖子,如果您发现更多信息,请随意评论^^,我也会发布第二个问题。谢谢AJ,这确实有效,非常感谢您为此付出的所有努力!