(转)java 存储过程或函数开发(总结)

(转载地址: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;

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章