Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Table of Contents
maxLevel2

 

 

개요

...

본 문서는 JAVA 환경에서 Altibase를 연동해 개발하는 방법과 개발 시에 주의해야 하는 사항에 대해 기술한 개발 가이드 문서이다.

...

Note

이 문서는 정보 제공을 목적으로 제공되며, 사전에 예고 없이 변경될 수 있습니다. 이 문서는 오류가 있을 수 있으며, 상업적 또는 특정 목적에 부합하는 명시적, 묵시적인 책임이 일절 없습니다.

이 문서에 포함된 Altibase 제품의 특징이나 기능의 개발, 발표 등의 시기는 Altibase 재량입니다.

Altibase는 이 문서에 대하여 관련된 특허권, 상표권, 저작권 또는 기타 지적 재산권을 보유할 수 있습니다.

 

 

개발 전 설정사항

...

JAVA에서 Altibase와 연동하기 위해서는 Altibase JDBC Driver가 필요하다. Altibase JDBC Diver에 대해 설명한다.

 

Altibase JDBC Driver 종류

...

Altibase는 두 종류의 JDBC driver를 제공하며, 파일 위치는 $ALTIBASE_HOME/lib 디렉토리이다.

...

Altibase.jar와 Altibase6_5.jar를 이용하여 버전이 서로 다른 Altibase와 연동하는 방법은 아래에서 설명한다

 

Altibase JDBC Driver 버전 확인

...

Altibase와 Altibase JDBC Driver 의 호환성 여부를 검증하기 위해 Altibase JDBC Driver 버전을 확인해야 한다.

...

일반적으로 Altibase의 버전과 같거나 상위 버전의 최신 Altibase JDBC Driver 파일을 사용하는 것을 권장한다.

 

 

Setting up JDBC Driver


Altibase JDBC Driver를 setting 하는 방법에 대해 설명한다.

 

JRE에서 설정하는 방법


Java Application에서 Altibase JDBC Driver를 사용하기 위해서는 JRE에서 Altibase JDBC Driver를 인식하여야 한다.

다음 제시되는 3가지 방법 중에서 한가지 방법을 이용한다.

방법 1. CLASSPATH 환경 변수

환경변수 CLASSPATH에 Altibase JDBC Driver(Altibase.jar) 파일 위치를 추가한다.

1) Windows

    • 신규 CLASSPATH 생성 : 내 컴퓨터 – 속성 – 고급 – 환경 변수에서 [새로 만들기] 버튼을 클릭하여 CLASSPATH 변수 등록
    • 기존 CLASSPATH 사용 : 지정된 변수 맨 마지막에 Altibase JDBC Driver 위치 추가


2) Unix

  • 환경설정파일(ex .profile)에 CLASSPATH를 추가한다.

    Code Block
    themeDJango
    languagebash
    export ALTIBASE_HOME=$HOME/altibase_home
    export CLASSPATH=.:$ALTIBASE_HOME/lib/Altibase.jar

3) Linux

  • 환경설정파일(ex .bash_profile)에 CLASSPATH를 추가한다.

    Code Block
    themeDJango
    languagebash
    export ALTIBASE_HOME=$HOME/altibase_home
    export CLASSPATH=.:$ALTIBASE_HOME/lib/Altibase.jar

방법 2. JRE(Java Runtime Environment) 디렉토리

  • JRE 환경에서 Altibase JDBC Driver(Altibase.jar)을 자동으로 참조할 수 있도록 다음 디렉토리에 Altibase.jar 파일을 위치시킨다.

    Code Block
    themeDJango
    languagebash
    $JAVA_HOME/jre/lib/ext 디렉토리
    또는
    $JRE_HOME/lib/ext 디렉토리

    $JAVA_HOME은 JDK의 설치 디렉토리, $JRE_HOME은 JRE의 설치 디렉토리를 의미한다.

방법 3. 실행 시 –classpath 옵션

  • java 명령어로 Java Application을 실행할 때 –cp 또는 –classpath 옵션 으로 Altibase JDBC Driver 지정한다.

    Code Block
    themeDJango
    languagebash
    $ java –classpath [디렉토리 경로]/Altibase.jar ClassFileName
    예시)
    $ java –classpath $ALTIBASE_HOME/lib/Altibase.jar HelloApp

 

Eclipse 설정 방법


Eclipse에서 Altibase JDBC Driver를 추가하는 방법은 다음과 같다.

  1. 프로젝트에서  JRE System Library [J2SE-1.5]  클릭
  2. JRE System Library [J2SE-1.5] 의 Properties 클릭
  3. Installed JREs  버튼 클릭
  4. Installed JREs 항목 중 jre 선택 후 Edit 버튼 클릭
  5. Add External JARs  버튼  클릭
  6. $ALTIBASE_HOME/lib 디렉토리에 있는 Altibase.jar 선택

 

 

Driver loading & Connection URL 사용법

...

Altibase JDBC Driver를 로딩하고 Altibase에 연결하는 방법에 대해 설명한다.

 

Driver loading

...

Altibase JDBC Driver 클래스 이름은 Altibase.jdbc.driver.AltibaseDriver이다. 

...

Code Block
themeDJango
languagejava
Class.forName("Altibase.jdbc.driver.AltibaseDriver");


일반 Connection

...

JDBC에서 Connection 객체를 얻을 때 DriverManager.getConnection 메소드를 호출한다.

...

Code Block
themeDJango
languagesql
iSQL> SELECT DB_NAME FROM V$DATABASE;
DB_NAME 
------------------------------------------------------------------------------------------------------------------------------------
mydb 
1 row selected.

 

Connection시 설정하는 Property

...

Connection을 얻을 때 db의 사용자명, 패스워드를 포함해 여러 가지 프로퍼티를 지정할 수 있다. 프로퍼티들은 java.util.Properties 클래스를 이용하여 지정하거나, String url 부분에 &property_name=value 형태로 연결하여 지정할 수 있다.

...

  1. Property 클래스 이용

    Code Block
    themeDJango
    languagejava
    Properties props1 = new Properties();
    props1.put("user", "sys");
    props1.put("password", "manager");
    Connection altibaseConnection1 = DriverManager.getConnection(db_url1, props1);


  2. URL에 연결하여 지정

    Code Block
    themeDJango
    languagejava
    String db_url1 = "jdbc:Altibase://192.168.1.111:20300/mydb?user=sys&password=manager";
    Connection altibaseConnection1 = DriverManager.getConnection(db_url1);

Altibase의 ConnectionPool을 이용한 Connection

...

  1. 6.3.1 버전 이상

            Altibase에서 제공하는 AltibaseConnectionPoolDataSource 클래스를 사용하면 ConnectionPool을 이용하여 Connection을 관리할 수 있다.

...

프로퍼티설명

url

Altibase와 연결을 위한 Connection string정보
jdbc:Altibase://IP:port_no/db_name” 형태로 기입

user

데이터베이스 계정

password

데이터베이스 패스워드

maxPoolSize

최대 Connection 수. 기본값 10.

minPoolSize

최소 Connection 수. 기본값 0.

initialPoolSize

초기 Connection 수. 기본값 1.

maxIdleTime

idle 대기 시간

propertyCycle

ConnectionPool이 다 찼을 때 대기 시간(millisec)

 

XA를 이용한 Connection

...

  1. 6.3.1 이상 버전

            분산 트랜잭션을 관리하기 위해서는 AltibaseXADataSource 클래스를 사용하여 Connection을 얻어 올 수 있다.이 클래스는 Altibase.jdbc.driver 패키지에 정의되어 있다.

...

                                                                                                                             

상이한 Altibase 버전 동시 접속

...

Altibase v5 이상부터는 하나의 어플리케이션에서 Altibase 상위 버전과 하위버전을 동시에 접속할 수 있도록 추가로  Altibase Driver(Altibase5.jar) 를 제공한다. 해당 Driver 클래스의 이름은 Altibase5.jdbc.driver.AltibaseDriver로 정의되어 있다.

...

Code Block
titleAltibaseMultiversionConnection.java
themeDJango
languagejava
 // cm 버전을 추가한 URL 예시
String db_url1 = "jdbc:Altibase_5.6.2://192.168.1.111:20300/mydb"; 
String db_url2 = "jdbc:Altibase_4.5.1://192.168.1.222:20300/mydb"; 

 

Stored Procedure/Function 호출

...

DB에 생성한 Stored Procedure를 호출할 때에는 call SQL 문을 다음과 같이 작성하면 된다.

  1. Stored Procedure

    Code Block
    themeDJango
    languagejava
    { call procedure_name(?,?,....) }
    * ?는 procedure의 parameter에 대응되는 매개변수이다.
  2. Stored Function

    Code Block
    themeDJango
    languagejava
    { call ? := function_name(?,?,....) }
    * := 전 에 있는 ‘?’는 function을 호출한 후 결과 값을 나타내는 매개변수이다.
     () 안에 있는 ‘?’는 function의 parameter에 대응되는 매개변수이다.
    

...

Code Block
titleAltibasePSMCall.java
themeDJango
languagejava
// Stored Procedure 호출
String sql1 = "{call sum_proc(?,?,?)}";
CallableStatement altibaseStatement1 = altibaseConnection1.prepareCall(sql1);
altibaseStatement1.setInt(1,10);
altibaseStatement1.setInt(2,20);
altibaseStatement1.registerOutParameter(3,java.sql.Types.NUMERIC);
altibaseStatement1.execute();
System.out.println(altibaseStatement1.getDouble(3));
System.out.println();
// Stored Function 호출
String sql2 = "{call ? := sum_func(?,?)}";
CallableStatement altibaseStatement2 = altibaseConnection1.prepareCall(sql2);
altibaseStatement2.registerOutParameter(1,java.sql.Types.NUMERIC);
altibaseStatement2.setInt(2,10);
altibaseStatement2.setInt(3,20);
altibaseStatement2.execute();
System.out.println(altibaseStatement2.getDouble(1));



개발 참고 사항

executeBatch()의 사용

...

Bulk성 DML문 처리가 필요한 경우, executeBatch()를 사용하면 array processing을 이용하여 여러 건의 데이터를 array에 담아놓고 서버로 한번에 전송하는 방식을 권장한다. 

...

사용방법은 먼저 addBactch()를 이용하여 n개의 데이터를 array에 계속 담고, executeBatch()를 실행하면 된다.

 

setFetchSize()의 사용

...

setFetchSize() 메소드를 사용하면 조회 시 DB 서버로부터 한번에 fetch하는 레코드의 개수를 지정할 수 있다.

...

예를 들어 5000byte의 레코드를 fetch하는 프로그램에서 setFetchSize(10)에 비해 setFetchSize(1000)으로 지정한 것은 약 5000*(1000-10)=4950K bytes 만큼 더 메모리가 더 증가되게 된다.  

 

자원의 반납

...

Connection, Statement, ResultSet 객체의 사용이 끝나면 명시적으로 close() 메소드를 호출하여 해당 자원을 반납해야 한다.

만약 close()를 호출하지 않으면 사용되지 않는 Connection, Statement, ResultSet 객체들이 계속 heap 메모리에 남아 있을 수 있고, 특히 Statement의 객체가 heap 메모리에 남아있게 된다면 DB서버는 해당 SQL을 prepare한 내용을 계속 저장하고 있어야 하므로 DB서버의 불필요한 메모리가 증가하게 된다.(PreparedStatement도 마찬가지다.) 

 

NULL 값의 처리

...

PreparedStatement 객체를 이용할 때 NULL 값을 setting하기 위해서는 setObject()메소드와 setNull() 메소드를 이용할 수 있다.

...

 Altibase는 setObject(parameterIndex, null) 메소드는 지원하지 않는다.

 

LOB 데이터 처리

...

LOB데이터를 처리하기 위해 반드시 autocommit을 off로 설정해야 된다.

...

LOB 데이터 연동 예제는 $ALTIBASE_HOME/sample/JDBC/CLOB과 BLOB 안에 있는 java 소스 파일을 참조하면 된다.

 

REF CURSOR 사용하는 방법

...

Java Program에서 REF CURSOR를 사용하는 방법은 다음과 같다.

...

Code Block
themeDJango
languagesql
-- TYPE 정의
CREATE OR REPLACE TYPESET my_type
AS
TYPE my_cur IS REF CURSOR;
END;
/


-- REF CURSOR 정의
CREATE OR REPLACE PROCEDURE my_ref_cursor
( v_result OUT my_type.my_cur, v_sql IN VARCHAR(1000) )
AS
BEGIN
OPEN v_result FOR v_sql;
END;
/
-- AltibaseRefCursor.java 파일
…
String sql = "SELECT to_char(sysdate,'YYYY-MM-DD') FROM dual";
altibaseStatement3= altibaseConnection1.prepareCall(" { call my_ref_cursor(?)}");
altibaseStatement3.setString(1,sql);
altibaseStatement3.execute();
rs = altibaseStatement3.getResultSet();
while(rs.next()){
System.out.println(rs.getString(1));
}

 


오류 사항

Timeout 관련 오류

...

원인

해결방안

...

 

Invalid descriptor index 

...

원인

해결방안

 

Optional feature not implemented 

...

원인

해결방안

...