(轉載地址:http://www.itpub.net/thread-399905-1-1.html)
有個需求,需要把oracle 數據庫中表的數據,變化的結果反饋到消息服務器中。
這裏的消息服務器用的是active mq。
考慮到可以使用oracle java存儲過程實現這個功能。
經過一番辛苦。主要在破機器上折騰點了半天。
java 對內存的要求還是比較高的。
具體步驟如下:
java函數或存儲過程創建過程
調整數據庫初始化參數:
*.java_max_sessionspace_size =2073741824
*.java_soft_sessionspace_limit =104857600
*.java_pool_size=312m
*.utl_file_dir=*
環境變量:
$JAVA_HOME--must be set to the top directory of the installed JDK base
$PATH--requires $JAVA_HOME/bin
$LD_LIBRARY_PATH for Solaris must include $JAVA_HOME/lib
$CLASSPATH must include $JAVA_HOME/lib
示例:
PATH=$ORACLE_HOME/jdk/bin:$ORACLE_HOME/bin:/bin:/usr/bin:/usr/ucb:/etc:/usr/openwin/bin:/usr/ccs/bin;export PATH
JAVA_HOME=$ORACLE_HOME/jdk;export JAVA_HOME
LD_LIBRARY_PATH=$JAVA_HOME/lib;export LD_LIBRARY_PATH
CLASSPATH=$JAVA_HOME/lib;export CLASSPATH
java -version
看看jdk 的版本.
我這裏用的必須是1.4.
創建用戶:
新建立用戶UJAVA
UJAVA 用戶需要單獨的表空間.
授權:
以sys用戶授權
execute dbms_java.grant_permission( 'UJAVA', 'SYSracle.aurora.security.JServerPermission', 'Verifier', '' );
execute dbms_java.grant_permission( 'UJAVA', 'SYS:java.net.SocketPermission', '172.18.10.116:61616', 'accept, connect,
listen, resolve' );
具體授權根據情況而定.
上面的授權語句都是在loadjava 和後來執行中總結出來的.
注:如果,出現權限問題,就把下面的腳本全部執行.
execute dbms_java.grant_permission('UJAVA','java.util.PropertyPermission','*','*');
execute dbms_java.grant_permission('UJAVA','java.io.SerializablePermission','*','*');
execute dbms_java.grant_permission('UJAVA','java.io.FilePermission','*','*');
execute dbms_java.grant_permission('UJAVA','java.net.NetPermission','*','*');
execute dbms_java.grant_permission('UJAVA','java.net.SocketPermission','*','*');
execute dbms_java.grant_permission('UJAVA','java.lang.RuntimePermission','*','*');
execute dbms_java.grant_permission('UJAVA','java.lang.reflect.ReflectPermission','*','*');
execute dbms_java.grant_permission('UJAVA','java.security.SecurityPermission','*','*');
execute dbms_java.grant_permission('UJAVA','oracle.aurora.rdbms.security.PolicyTablePermission','*','*');
execute dbms_java.grant_permission('UJAVA','oracle.aurora.security.JServerPermission','*','*');
加載jar包到數據庫:
所有這些jar包用ftp binary方式提供。
loadjava -u ujava/ujava@tsolaris -v -o -noverify -f jdom.jar commons-logging-1.0.3.jar commons-cli-1.0.jar
commons-configuration-1.0-dev.jar geronimo-spec-jms-1.1-rc4.jar geronimo-spec-j2ee-management-1.0-rc4.jar
concurrent-1.3.4.jar activemq-core-3.0.jar log4j-1.2.8.jar jce1_2_1.jar jakarta-regexp-1.3.jar
servlet.jar activeio-1.0.jar geronimo-spec-j2ee-jacc-1.0-rc4.jar geronimo-spec-jta-1.0.1B-rc4.jar spring-1.1.jar
jmssyn.jar
loadjava -u ujava/ujava@tsolaris -v -o -noverify -r jdom.jar commons-logging-1.0.3.jar commons-cli-1.0.jar
commons-configuration-1.0-dev.jar geronimo-spec-jms-1.1-rc4.jar geronimo-spec-j2ee-management-1.0-rc4.jar
concurrent-1.3.4.jar activemq-core-3.0.jar log4j-1.2.8.jar jce1_2_1.jar jakarta-regexp-1.3.jar
servlet.jar activeio-1.0.jar geronimo-spec-j2ee-jacc-1.0-rc4.jar geronimo-spec-jta-1.0.1B-rc4.jar spring-1.1.jar
jmssyn.jar
編譯無效的對象:
Select 'alter java class "'||dbms_java.longname (object_name)||'" resolve;' from user_objects
where object_type = 'JAVA CLASS' and status = 'INVALID';
該語句的執行結果反覆執行,直到剩下的無效的對象不能在編譯成功爲止.
可以從試圖user_errors查詢編譯錯誤.
創建java類:
見dataprocess.jsp腳本.
#這個文件不方便提供了。
該腳本需要在pl/sql develop 的java source窗口中執行.
創建調用java類的函數或存儲過程:
CREATE OR REPLACE Function test_java(Name Varchar2) Return Varchar2
AS LANGUAGE Java
NAME ' DataProcess.deal(java.lang.String ) return java.lang.String';
使用java函數:
set serveroutput on size 5000;
execute dbms_java.set_output(2000);
這個命令用於調試java存儲過程
在$ORACLE_BASE/admin/$ORACLE_SID/dump目錄中會出現trc文件.
ALTER SESSION SET EVENTS '10046 trace name context forever, level 4';
不知道java在數據庫如何調試,只好如此了。
select test_java('y') from dual;