2011-09-03 159 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

非常感謝,我會這麼做的,我的問題沒有完全解答,但是我會定義只是投你的帖子,如果你發現更多的東西,請隨時發表評論^^,我也會發布第二個問題。 –