전형적인 엔터프라이즈 애플리케이션 환경에서는 DB2 애플리케이션에서 SQLJ 도구인 db2sqljcustomize와 db2sqljbind를 사용하는 경우가 많다. 이러한 SQLJ 도구는
SQLJ 애플리케이션을 사용자 정의하고 바인드하는 데 필요한 도구를 제공하는 Java 프로그램을 호출한다. 현재는 종료 코드를 사용하여 이러한 Java 프로그램이
쉘로 되돌아가도록 한다. 이렇게 하려면 JVM에서 지원하는 System.exit()를 호출해야 한다. 영(0)은 성공을 나타내는 반면에 0이 아닌 리턴 코드는
사용자 정의나 바인드 프로세스가 실패했음을 나타낸다.
System.exit()가 호출되면 JVM이 종료되므로 JVM이 계속해서 작동해야 하는 Ant나 Maven과 같은 특정 빌드 도구에는 System.exit()가 부적합하다. 과거에는 사용자 정의와 바인드 프로세스
이후에 System.exit나 JVM을 추적할 수 있는 대체 방법이 없었다. 그러한 경우에는 해당 애플리케이션을 다시 실행하여 나머지 비즈니스 논리를
계속 수행한다. 쉘 스크립트로 유틸리티를 실행하는 경우에는 이렇게 하는 것이 좋지만, Ant와 같은 특정 빌드 도구에서는 Java 프로그램이
System.exit()를 호출하면 문제가 발생한다. 예를 들어, Ant와 같은 빌드 도구가 System.exit를 추적하지 않고 Ant와 동일한 JVM에서 실행하는
기본 보안 관리자와 함께 작동하는 경우에는 사용자 정의나 바인드 프로세스 이후에 이 빌드 도구가 종료될 수 있다.
이 기사에서는 새로운 JDBC Universal 드라이버의 글로벌 특성인 db2.jcc.sqljToolsExitJVMOnCompletion과 이 특성을 사용하는 방법을 살펴본다.
새로운 글로벌 특성을 사용하려면 다음과 같은 것들이 필요하다.
- 간단한 SQLJ 애플리케이션 및 직렬화된 SQLJ 프로파일 — 임베디드 SQL문이 있는 Java 애플리케이션이다. SQLJ 애플리케이션을 변환하면 .class 파일과 하나 이상의 직렬화된 프로파일이 생성된다. 기본적으로 이 애플리케이션은 Java 컴파일러를 호출한다.
- 간단한 JDBC 애플리케이션 — db2sqljcustomize 및 db2sqljbind와 같은 SQLJ 도구가 있는 간단한 Java 애플리케이션이다.
- SQLJ 및 JDBC용 IBM DB2 Universal 드라이버 — 이 드라이버는 com.ibm.db2.jcc.DB2Driver이며, 여기에는 db2jcc.jar가 포함되어 있다. sqlj.zip에는 SQLJ 변환기가 포함되어 있다.
- 글로벌 특성 파일인 DB2JccConfiguration.properties — 이 자원 파일은
db2.jcc.sqljToolsExitJVMOnCompletion특성을 설정하기 위한 것이다. 이 특성은 DB2Configuration.properties에서 설정하거나-D를 사용하여 Java 명령에 전달한다. 이 특성을 다른 방법으로 설정할 수도 있는데, 이 방법은 DB2 Information Center의 JDBC용 IBM Data Server Driver 사용자 정의 및 SQLJ 구성 특성 섹션을 참조한다.
새로운 글로벌 JCC 특성인 db2.jcc.sqljToolsExitJVMOnCompletion에는 부울 리턴 유형이 있다. 이 특성의 기본값은 true이다. 따라서 모든 SQLJ 도구는
완료되는 즉시 System.exit()를 호출한다. SQLJ 도구를 실행하고 나서 System.exit()를 추적하려면 이 특성 값을 false로 설정해야 한다(db2.jcc.sqljToolsExitJVMOnCompletion=false).
오류 유무와 관계없이 기본적으로 JVM은 System.exit가 호출되면 종료된다. SQLJ 도구가 실행되면 오류와 관계없이 System.exit가 호출된다. 이 특성을 false로
설정하면 사용자 정의가 실패하는 경우에도 쉘은 리턴 코드 0을 얻는다. 해당 메소드로부터 리턴 코드를 얻기 위해 customizeMain을 프로그램 방식으로 사용할 수 있다.
이 특성 값을 db2.jcc.sqljToolsExitJVMOnCompletion=false로 설정하는 경우, 사용자 정의나 바인드 프로세스에서 오류가 발생하면 애플리케이션 리턴 코드가 0이 된다.
이 특성 값을 db2.jcc.sqljToolsExitJVMOnCompletion=true로 설정하는 경우, 사용자 정의나 바인드 프로세스에서 오류가 발생하면 애플리케이션 리턴 코드가 0이 아닌
값이 된다.
DB2 Universal Driver JAR 파일 db2jcc.jar와 sqlj.zip을 해당 클래스 경로에 삽입했는지 확인한다.
이 SQLJ 애플리케이션은 데이터 소스 오브젝트 ds를 사용하여 데이터베이스와 연결되며 위치가 지정된 반복자를 사용하여 기존의 Employee 테이블에서 해당 행을 페치한다.
리스트 1. 기본 테이블에서 행을 페치하는 SQLJ 프로그램
import java.sql.*;
// Create connection context class DB2Connect
#sql context DB2Connect;
// Declare positioned iterator ByPos
#sql iterator ByPos(String,int);
public class sqljapp {
public static void main(String[] args) throws Exception
{
// Create a DataSource object ds
javax.sql.DataSource ds =
new com.ibm.db2.jcc.DB2SimpleDataSource();
((com.ibm.db2.jcc.DB2BaseDataSource) ds).
setServerName("localhost");
((com.ibm.db2.jcc.DB2BaseDataSource) ds).
setPortNumber(50000);
((com.ibm.db2.jcc.DB2BaseDataSource) ds).
setDatabaseName("SAMPLE");
((com.ibm.db2.jcc.DB2BaseDataSource) ds).
setDriverType(4);
java.sql.Connection con =
ds.getConnection("administrator", "passwd");
// Creating connection context object db2con
DB2Connect db2con = new DB2Connect(con);
// Declare the object of ByPos class
ByPos positer;
// Use db2con for executing an SQL statement
#sql[db2con] positer= { select * from EMPLOYEE };
}
}
|
애플리케이션을 변환하면 표준 Java 소스 파일과 직렬화된 SQLJ 프로파일(sqljapp_SJProfile0.ser)이 생성된다.
리스트 2. SQLJ 프로그램 변환
C:\jcc_home3\jcc>sqlj sqljapp.sqlj |
이것은 매개변수를 사용자 정의 유틸리티에 전달하는 간단한 Java 애플리케이션이다. 새로운 특성을 사용하지 않은 상태에서 단일 JVM에서 이 Java 애플리케이션을
실행하게 된다. 이 애플리케이션은 System.exit()를 사용하여 리턴 코드로 호출자를 종료한다. 사용자 정의가 성공적으로 실행되면 리턴 코드가 0이 된다. 이 애플리케이션은
db2sqljcustomize 유틸리티가 완료된 후에는 어떤 코드(함수 fun_checkJVM)도 호출하지 않는다.
리스트 3.
db2.jcc.sqljToolsExitJVMOnCompletion 특성을 사용하지 않는 Java 애플리케이션
public class JVMexit {
public static void main(String a[]) throws Exception {
// Array of String as parameters to db2sqljcustomize
String[] cmd = { "-url", "jdbc:db2://localhost:50000/SAMPLE",
"-user","administrator", "-password", "passwd", "-onlinecheck",
"YES", "-rootPkgName", "BCB", "-collection", "COL18",
"-tracefile", "trace_cust.txt", "-tracelevel", "TRACE_ALL",
"sqljapp_SJProfile0.ser" };
// Create an object of db2sqljcustomize
com.ibm.db2.jcc.sqlj.Customizer cust = new
com.ibm.db2.jcc.sqlj.Customizer();
// Execute the db2sqljcustomize with arguements
cust.main(cmd);
/* Function to check if JVM exited or not,if exited it will not call
below function or else it will. */
fun_checkJVM();
}
private static void fun_checkJVM() {
System.out.println("JVM didn't exit");
}
}
|
이제까지 새로운 글로벌 특성을 사용하지 않고 단일 JVM에서 Java 애플리케이션을 실행하는 방법을 살펴보았다. (이 특성의 기본값은
true이다(db2.jcc.sqljToolsExitJVMOnCompletion=true). 이제 글로벌 특성 파일 DB2JccConfiguration.properties에서 특성 값을
db2.jcc.sqljToolsExitJVMOnCompletion=false로 설정하여 동일한 Java 애플리케이션을 실행하는 시나리오를 살펴보자.
5단계: 글로벌 파일 DB2JccConfiguration.properties
자원 파일 DB2JccConfiguration.properties를 작성하여 해당 클래스 경로에 삽입하고 아래와 같이 특성을 추가한다.
리스트 4. DB2JccConfiguration.properties
//Add the property value as false in file db2.jcc.sqljToolsExitJVMOnCompletion=false |
사용자 정의 프로세스가 완료되면 애플리케이션이 해당 코드를 실행한다. fun_checkJVM() 함수가 호출될 것이며 이렇게 되면
사용자 정의 프로세스가 완료된 후에 애플리케이션이 System.exit()를 호출하지 않았다는 것이 입증된다.
이제 사용자 정의 프로세스에서 오류가 발생한 상태에서 전체 Java 애플리케이션을 실행하는 시나리오를 살펴보자. 이렇게 하려면 마찬가지로
특성 값을 false(db2.jcc.sqljToolsExitJVMOnCompletion=false)로 설정한다.
7단계: 잘못된 매개변수가 포함된 Java 애플리케이션 실행
잘못된 매개변수를 사용하는 애플리케이션 실행 예제에서는 애플리케이션이 function fun_checkJVM()을 호출하더라도 사용자 정의 프로그램이나 바인드 프로세스에서
오류가 발생하며 따라서 사용자 정의 프로세스가 완료된 후에 애플리케이션이 System.exit()를 호출하지 않았다는 것이 입증된다.
리스트 5. 잘못된 매개변수가 포함된 Java 애플리케이션
public class JVMexit {
public static void main(String a[]) throws Exception {
// Array of String with wrong port # as parameter to db2sqljcustomize
String[] cmd = { "-url", "jdbc:db2://localhost:5000/SAMPLE",
"-user","administrator", "-password", "passwd", "-onlinecheck",
"YES", "-rootPkgName", "BCB", "-collection", "COL18",
"-tracefile", "trace_cust.txt", "-tracelevel", "TRACE_ALL",
"sqljapp_SJProfile0.ser" };
// Create an object of db2sqljcustomize
com.ibm.db2.jcc.sqlj.Customizer cust = new
com.ibm.db2.jcc.sqlj.Customizer();
// Execute the db2sqljcustomize with arguments
cust.main(cmd);
/* Function to check if JVM exited or not,if exited it will not call
below function or else it will. */
fun_checkJVM();
}
private static void fun_checkJVM() {
System.out.println("JVM didn't exit");
}
}
|
이 기사에서는 새로운 특성인 db2.jcc.sqljToolsExitJVMOnCompletion을 사용하여 사용자 정의 및 바인드와 같은 SQLJ 도구가 완료되는 즉시
System.exit()를 추적하는 방법을 살펴보았다. 이 특성 값을 false로 설정하면 SQLJ 도구를 실행하는 과정에서 오류가 발생하는 경우에도
애플리케이션이 JVM을 종료하지 않기 때문에 해당 애플리케이션이 계속 실행될 수 있다.
교육
- 이러한 도구에 관한 자세한 정보는 DB2 Information Center의 db2sqljcustomize and db2sqljbind 관련 섹션을 참조한다.
- DB2 Information Center에서 JDBC용 IBM Data Server 드라이버 사용자 정의 및 SQLJ 구성 특성을 자세히 배우자.
- developerWorks의 DB2 for Linux, UNIX, and Windows에서 DB2를 자세히 배우자.
- DB2를 사용한 Java 애플리케이션 개발에 관해 자세히 배우자.
- developerWorks Information Management
영역에서는 Information Management에 대한 정보를 제공한다. 기술 자료, 사용법 기사, 교육, 다운로드, 제품 정보 등을 찾아볼 수 있다.
- developerWorks 기술 행사 및 웹 캐스트를 통해 최신 정보를 얻을 수 있다.
- Twitter의 developerWorks 페이지를 살펴보자.
제품 및 기술
- developerWorks에서 직접 다운로드할 수 있는
IBM 시험판 소프트웨어를 사용하여 후속 개발 프로젝트를 구현해 보자.
토론
- 포럼에 참여하기.
- developerWorks 포럼 & 블로그를 통해
developerWorks 커뮤니티에 참여하자.
