Java External Procedure 생성법
티베로 DBMS에서 제공하는 Java External Procedure 기능 생성 절차를 기본 환경 설정과 생성 단계로 나누어 설명합니다.
기본 환경설정
본 절에서는 Java External Procedure를 생성하기에 앞서 기본 환경을 설정하는 방법을 설명합니다.
초기화 파라미터
JEPA 프로세스의 실행과 관련하여 사용자가 설정할 수 있는 초기화 파라미터는 아래와 같습니다.
<<$TB_SID.tip>>
_PSM_BOOT_JEPA=Y
JAVA_CLASS_PATH=/home/tibero/tibero7/instance/tibero/java
초기화 파라미터
설명
_PSM_BOOT_JEPA
JEPA 프로세스의 기동 여부를 설정합니다.
Y : JEPA 프로세스를 기동하기 위해서는 반드시 이 초기화 파라미터에 'Y'를 설정해야 합니다.
N : 데이터베이스 서버는 기동이 되지만, JEPA 프로세스는 기동되지 않습니다.
JAVA_CLASS_PATH
사용자가 Java 객체를 생성할 때 컴파일 경로로 사용됩니다.
이 항목이 설정되어 있지 않으면, DB_CREATE_FILE_DEST 초기화 파라미터에 설정된 경로의 하위 디렉터리 Java에 클래스 파일이 생성됩니다.
JEPA 연결정보
$TB_HOME/client/config 디렉터리에 위치한 tbdsn.tbr 파일에 JEPA 프로세스의 접속 정보를 설정합니다.
아래는 tbdsn.tbr 파일에 설정된 접속 정보의 예입니다.
<<tbdsn.tbr>>
epa=(
(EXTPROC=(LANG=JAVA)
(LISTENER=(HOST=localhost)
(PORT=9390)
)
)
)
Tibero 서버는 접속 정보를 이용하여 JEPA 프로세스에 연결합니다.
JEPA 환경설정
$TB_HOME/client/epa/java/config 디렉터리에 위치한 epa.cfg 파일을 사용자의 시스템 환경에 맞게 수정 합니다. 환경설정이 적용되면 Java External Procedure를 생성할 준비가 모두 완료됩니다.
아래는 epa.cfg 파일을 설정한 예입니다.
<<epa.cfg>>
# listener port
LISTENER_PORT=9390
# initial thread pool size
INIT_POOL_SIZE=10
# max thread pool size
MAX_POOL_SIZE=1000
# gateway encoding "ASCII", "EUC-KR", "MSWIN949", "UTF-8", "UTF-16", "SHIFT-JIS"
ENCODING=UTF-8
#STATIC_LOADING_CLASSES=ex.StaticClass1, ex.st.Class2
초기화 파라미터
설명
LISTENER_PORT
tbdsn.tbr 파일에 설정한 포트 번호와 동일하게 설정합니다.
INIT_POOL_SIZE
JEPA 프로세스가 기동할 때 처음으로 생성하는 스레드의 개수입니다.
MAX_POOL_SIZE
JEPA 프로세스가 생성할 수 있는 최대 스레드의 개수입니다.
ENCODING
JEPA 프로세스에서 사용할 인코딩 방식입니다. 단, 데이터베이스 서버와 동기 화를 위해서 반드시 서로 같은 인코딩을 사용해야 합니다.
STATIC_LOADING_
CLASSES
JNI를 사용하는 library와 같이 Dynamic Class Loading하기에 적합하지 않은 클래스 라이브러리를 사용할 경우에 필요한 파라미터입니다.
Java External Procedure 생성
Java External Procedure를 생성하기 위해서는 아래와 같은 세부 절차를 수행합니다.
Java 객체 생성
생성된 Java 객체 컴파일
PSM 함수 생성
Java 클래스 실행
1. Java 객체 생성
Java External Procedure를 생성하기 위해서는 먼저 Java에서 동적으로 호출할 수 있는 형태의 사용자 Java 클래스를 DBMS에 등록합니다. 즉, 사용자 Java 클래스를 하나의 데이터베이스 객체로 등록하는 과정입니다.
이 과정을 통해 PSM 개체 하나와 사용자 Java 클래스를 대응시키면 기존의 PSM을 호출하는 것과 똑같은 인터페이스로 사용자 Java 클래스를 사용할 수 있습니다.
아래는 Java 객체를 생성하는 예입니다.
SQL> CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JavaExtproc" AS
public class SimpleMath {
public static int findMax(int x, int y) {
if (x >= y) return x;
else return y;
}
}
/
Java Source 'JavaExtproc' created.
SQL>
위와 같은 DDL 문장을 실행하면, 데이터베이스에는 JavaExtproc라는 Java 객체가 생성됩니다. 생성된 Java 객체를 보려면 USER_OBJECTS 뷰나 LS 명령어를 이용하여 조회할 수 있습니다.
아래는 LS 명령어를 이용하여 생성된 Java 객체를 조회하는 예입니다.
SQL> LS
NAME OBJECT_TYPE
----------------------------- --------------
JavaExtproc JAVA
1 row selected.
SQL>
Java External Procedure에서 Java 객체를 호출할 때 빈 생성자(nullary constructor)를 호출하기 때 문에 생성자를 생략하거나 다른 생성자(constructor)를 사용할 경우에는 반드시 빈 생성자(nullary construc tor)를 명시합니다.
2. 생성된 Java 객체 컴파일
DDL 문장으로 작성된 Java 객체의 소스 코드는 별도의 파일로 생성되며, JAVA_CLASS_PATH 초기화 파라미터에 설정된 경로에 저장됩니다. Java 객체를 패키지로 생성할 경우 디폴트 저장 경로에 패키지 경로를 생성하여 클래스 파일 형태로 저장합니다.
예를 들면 아래와 같습니다.
SQL> CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "JavaExtproc" AS
package com.tmax;
public class SimpleMath {
public static int findMax(int x, int y) {
if (x >= y) return x;
else return y;
}
}
위 문장을 실행하면 최종적으로 JAVA_CLASS_PATH/com/tmax 디렉터리에 SimpleMath.class 파일이 생성됩니다. 생성된 클래스 파일은 외부 Java 컴파일러를 이용하여 컴파일합니다.
외부 Java 컴파일러는 $TB_HOME/bin 디렉터리에 있는 psmjavac 스크립트를 사용할 수 있습니다.
psmjavac 스크립트를 사용하여 실제 컴파일 명령어를 수행하는 문법은 아래와 같습니다.
javac -classpath ${classpath} ${src}
항목
설명
classpath
JAVA_CLASS_PATH 초기화 파라미터에 설정된 경로와
$TB_HOME/client/lib/jar/tibero7-jdbc.jar 경로가 기본적으로 포함됩니다.
src
컴파일을 수행할 Java 소스 코드입니다.
별도의 외부 라이브러리를 사용하여 Java 객체를 생성할 경우 psmjavac 스크립트 파일을 수정합니다.
예를 들어 JVM에서 제공하는 htmlconverter.jar를 사용하는 Java 객체를 생성할 경우에는 아래와 같은 명령어를 수행합니다.
javac -classpath ${classpath}:$JAVA_HOME/lib ${src}
JEPA가 별도의 VM으로 실행되기 때문에 외부 라이브러리를 사용한 객체를 침조하는 PSM 함수를 호출하는 경우 JEPA에서도 해당 라이브러리를 참조하고 있어야 합니다. JEPA는 $TB_HOME/client/bin 디렉터리에 있는 tbjavaepa 스크립트에 의해 실행되는데, 아래 exec java 명령 문장의 -classpath 옵션에도 라이브러리의 경로를 추가합니다.
exec java -verbose:gc -Xms128m -Xmx512m -Djavaepa="$TB_HOME"
-Dlog4j.configuration=$log4jfile
-classpath $pool:$collections:$log4j:
$:$:$config $mainclass CONFIG=$configfile
Java 객체를 삭제하기 위해서는 아래와 같은 명령을 사용 합니다.
SQL> DROP JAVA SOURCE "JavaExtproc";
Java Source 'JavaExtproc' dropped.
SQL>
3. PSM 함수 생성
CREATE JAVA 문장을 실행하려면 CREATE PROCEDURE 권한이 필요합니다.
Java 객체를 아래 예처럼 PSM과 대응시키는 과정을 거치고 나면 PSM 프로그램의 인터페이스를 그대로 사용할 수 있습니다.
SQL> CREATE OR REPLACE FUNCTION find_max(x PLS_INTEGER, y PLS_INTEGER)
RETURN PLS_INTEGER IS
LANGUAGE JAVA NAME 'SimpleMath.findMax(int, int) return int';
/
Function 'FIND_MAX' created.
SQL>
PSM 함수를 생성하는 문장에서 PSM과 Java 사이에서 변환하거나 사용할 수 있는 타입은 아래와 같습니다.
PSM 타입
Java 타입
CHAR, LONG, VARCHAR2
java.lang.String
java.sql.Date
java.sql.Time
java.sql.Timestamp
java.lang.Byte
java.lang.Short
java.lang.Integer
java.lang.Long
java.lang.Float
java.lang.Double
java.math.BigDecimal
byte
short
int
long
float
double
DATE
java.sql.Date
java.sql.Time
java.sql.Timestamp
java.lang.String
NUMBER
java.lang.Byte
java.lang.Short
java.lang.Integer
java.lang.Long
java.lang.Float
java.lang.Double
java.math.BigDecimal
byte
short
int
long
float
double
RAW, LONG RAW
byte[ ]
ROWID
java.lang.String
4. Java 클래스 실행
PSM 함수는 SQL 문장을 실행하는 것과 동일한 방법으로 실행할 수 있습니다.
아래는 SQL 문장에서 PSM 함수를 실행하는 예입니다.
SQL> select find_max(4,60) from dual;
FIND_MAX(4,60)
--------------
60
1 row selected.
SQL>
Last updated