天天看点

[20171215]oracle执行java程序.txt

[20171215]oracle执行java程序.txt

--//我以前提到假如oracle调用执行java程序会在/dev/shm下建立一堆JOXSHM_EXT开头的文件(实际上在内存中)

--//如果异常关闭数据库这些文件就会留在内存中.

--//参考链接:

http://blog.itpub.net/267265/viewspace-2141564/

--//如果在运行中java component发生中断,也会导致java related packages执行发生错误.

--//通过例子演示以及解决方法.

1.环境:

SCOTT@book> @ &r/ver1

PORT_STRING                    VERSION        BANNER

------------------------------ -------------- --------------------------------------------------------------------------------

x86_64/Linux 2.4.xx            11.2.0.4.0     Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production

$ ls -l /dev/shm/

total 0

2.建立java程序例子,我不熟悉java,抄一个现成的例子:

create or replace and compile java source named "math_java"

as

public class math_java

{

    public static int sum_java(java.lang.Integer a, java.lang.Integer b)

    {

        java.lang.Integer sum;

        sum = a+b;

        return sum;

    }

}

/

CREATE OR REPLACE FUNCTION sum_java (a NUMBER, b NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'math_java.sum_java(java.lang.Integer, java.lang.Integer) return java.lang.Integer' ;

Function created.

total 16

-rwxrwx--- 1 oracle oinstall 4096 2017-12-15 15:39:05 JOXSHM_EXT_0_book_229441542

-rwxrwx--- 1 oracle oinstall 4096 2017-12-15 15:39:05 JOXSHM_EXT_1_book_229441542

-rwxrwx--- 1 oracle oinstall 4096 2017-12-15 15:39:06 JOXSHM_EXT_2_book_229441542

-rwxrwx--- 1 oracle oinstall 4096 2017-12-15 15:39:06 JOXSHM_EXT_3_book_229441542

--//可以发现现在/dev/shm存在一些文件.

SCOTT@book> select sum_java(5,7) from dual;

SUM_JAVA(5,7)

-------------

           12

--//ok计算正确.

3.现在删除/dev/shm的内容:

$ rm -f /dev/shm/JOXSHM_EXT_*_book_229441542

--//退出再执行(注不退出执行可以正确执行,估计文件描述没有释放的原因).

SCOTT@book> select sum_java(5,7) from dual;

select sum_java(5,7) from dual

     *

ERROR at line 1:

ORA-03113: end-of-file on communication channel

Process ID: 55861

Session ID: 274 Serial number: 7

SCOTT@book> SELECT DBMS_JAVA.GETVERSION FROM dual;

SELECT DBMS_JAVA.GETVERSION FROM dual

*

Process ID: 55886

Session ID: 94 Serial number: 3

4.如何解决:

--//我测试刷新共享池不行.

SCOTT@book> alter system flush shared_pool;

System altered.

Process ID: 55900

Session ID: 106 Serial number: 7

--//重启数据库当然是一种解决问题的方法.

SYS@book> shutdown immediate ;

Database closed.

Database dismounted.

ORACLE instance shut down.

SYS@book> startup

ORACLE instance started.

Total System Global Area  634732544 bytes

Fixed Size                  2255792 bytes

Variable Size             197133392 bytes

Database Buffers          427819008 bytes

Redo Buffers                7524352 bytes

Database mounted.

Database opened.

--//重复前面的删除操作:

SCOTT@book> select sum_java(6,7) from dual;

select sum_java(6,7) from dual

Process ID: 56036

--//如果不重启,可以执行如下(以sys用户执行):

execute sys.dbms_registry.loaded('JAVAVM');

execute sys.dbms_registry.valid('JAVAVM');

alter system set java_jit_enabled=false scope=memory;

create or replace java system

/

alter system set java_jit_enabled=true scope=memory;

SYS@book> execute sys.dbms_registry.loaded('JAVAVM');

PL/SQL procedure successfully completed.

SYS@book> execute sys.dbms_registry.valid('JAVAVM');

SYS@book> alter system set java_jit_enabled=false scope=memory;

SYS@book> create or replace java system

  2  /

Java created.

--//注:这步有点慢,大约1分钟上下.

SYS@book> alter system set java_jit_enabled=true scope=memory;

SCOTT@book> select sum_java(6,7) from dual;

SUM_JAVA(6,7)

           13

GETVERSION

-----------

11.2.0.4.0

--//OK,现在能正常使用java程序了.