Skip to end of metadata
Go to start of metadata

 

 

개요


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

Altibase 6.5.1, JRE 혹은 JDK는 1.5 버전, 개발 IDE로는 Eclipse를 기반으로 작성되었다.

 

다음은 본 문서와 더불어 개발 시 참고해야 할 문서들이다.

1. 『Altibase환경의 개발 시 고려사항 가이드』

2. 『Altibase SQL Tuning Guide』

 

 

Icon

이 문서와 관련된 오류 및 개선사항은 기술지원포털 또는 기술지원센터로 문의주시기 바랍니다.

Icon

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

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

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

 

 

개발 전 설정사항


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

 

Altibase JDBC Driver 종류


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

  • Altibase.jar  : Altibase DB 연동 또는 버전이 동일한 여러 대의 Altibase 연동할 경우 사용하는 일반 JDBC Driver 파일
  • Altibase6_5.jar :Altibase 5버전과 그 이하의 버전을 연동 시 사용하는 JDBC Driver 파일

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

 

Altibase JDBC Driver 버전 확인


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

Altibase의 cm protocol version과 Altibase JDBC Driver의 CMP가 동일하면 호환 가능하다.

Altibase JDBC Driver 버전을 확인하는 명령어는 다음과 같다.

 

 

Altibase 버전을 확인하는 명령어는 다음과 같다.

일반적으로 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를 추가한다.

3) Linux

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

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

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

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

방법 3. 실행 시 –classpath 옵션

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

 

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이다. 

Class.forName 메소드를 호출하여 Driver를 loading하는 코드 예는 다음과 같다.


일반 Connection


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

이때 String 타입의 url을 argument로 넣어줘야 하는데, Altibase connection url 작성 예제는 다음과 같다.

 


다음은 위에 형식에 맞춰 Connection 객체를 얻어오는 예제이다.

AltibaseConnection.java

 

DB_NAME 조회 방법은 아래와 같다.

 

Connection시 설정하는 Property


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

지정 가능한 프로퍼티들은 다음과 같다.

 

프로퍼티 이름

설명

기본 값

portNumber

DB의 PORT_NO

20300

databaseName

DB의 NAME

JDBC

user

DB 사용자 이름

SYS

password

DB 사용자 암호

MANAGER

serverName

DB 서버의 IP

localhost

connType

Connection type

1 : TCP/IP

3 : IPC

1

 

다음은 property를 지정하는 예제이다.

  1. Property 클래스 이용


  2. URL에 연결하여 지정

Altibase의 ConnectionPool을 이용한 Connection


  1. 6.3.1 버전 이상

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

            AltibaseConnectionPoolDataSource 객체를 생성한 후, setUrl() 메소드를 이용하여 Connection url 정보를 setting해주거나, 각각의 프로퍼티를 setting해주는 set XXX() 메소드를 호출하여 구현하면 된다.

            AltibaseConnectionPoolDataSource 클래스는 Altibase.jdbc.driver 패키지 안에 정의되어 있다.

AltibaseConnectionPool.java

 

 

      2. 6.1.1 버전

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

            ABPoolingDataSource 객체를 생성한 후, setUrl() 메소드를 이용하여 Connection url 정보를 setting해주거나, 각각의 프로퍼티를 setting해주는 set XXX() 메소드를 호출하여 구현하면 된다.

            ABPoolingDataSource 클래스는 Altibase.jdbc.driver 패키지 안에 정의되어 있다.

AltibaseConnectionPool.java

 

필요하다면, ConnectionPool에 다음의 프로퍼티들을 적용할 수 있다.

프로퍼티설명

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 패키지에 정의되어 있다.

            AltibaseXAResource 객체를 통해 XAConnection 객체를 얻어오고, XAConnection 객체를 통해 Connection 객체를 얻어옴으로써 XA를 구현하는 예제는 다음과 같다.

AltibaseXAConnection.java

 

      2. 6.1.1 버전

            분산 트랜잭션을 관리하기 위해서는 Altibase가 제공하는 ABXADataSource, 클래스를 사용하여 Connection을 얻어 올 수 있다.

            이 클래스는 Altibase.jdbc.driver 패키지에 정의되어 있다. 다음의 예제처럼 ABXAResource 객체를 통해 XAConnection 객체를 얻어오고, XAConnection 객체를 통해 Connection 객체를 얻어옴으로써 XA를 구현 할 수 있다. 

AltibaseXAConnection.java

 


Failover를 이용한 Connection


 

Altibase v5.3.3 버전부터 Connection url부분에 Failover 관련 속성을 정의할 수 있다.

 

 Failover를 이용하여 Altibase에 연결하는 예제이다.

AltibaseFailOverConnection.java


Failover 관련 속성은 다음과 같다.

속성

설명

alternateservers

장애 발생시 접속하게 될 가용 서버를 나타내며 (IP Address1:Port1, IP Address2:Port2,...) 형식 기술

connectionretrycount

가용 서버 접속 실패 시, 접속 시도 반복 횟수

connectionretrydelay

가용 서버 접속 실패 시, 다시 접속을 시도하기 전에 대기하는 시간(초단위)

loadbalance

on 설정 : 최초 접속 시도 시에 기본 서버와 가용 서버를 포함하여 랜덤으로 선택

off 설정 : 최초 접속 시도 시에 기본 서버에 접속하고, 접속에 실패하면 AlternateServer로 기술한 서버에 접속

sessionfailover

STF(Service Time Fail-Over)를 할 것인지 여부를 나타낸다. Altibase는 CTF를 권장한다.

on : STF, off : CTF

  • CTF(Connection Time Fail-Over) : DBMS 접속 시점에 장애를 인식하여 장애가 발생한 DBMS 대신 다른 가용 노드의 DBMS로 접속하고 서비스 진행
  • STF(Service Time Fail-Over) : DBMS 접속에 성공하여 서비스하는 도중에 장애가 발생하는 것으로, 다른 가용 노드의 DBMS에 다시 접속하여 세션의 프로퍼티를 복구한 후 사용자 응용 프로그램의 업무 로직을 다시 수행. 즉 장애가 발생한 DBMS에서 수행된 작업을 다시 한 번 수행할 필요가 있는 경우 설정 필요

                                                                                                                             

상이한 Altibase 버전 동시 접속


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

어플리케이션에서  Class.forName() 메소드를 이용하여 Driver 클래스를 로딩할 때 클래스 명을  Altibase.jdbc.driver.AltibaseDriver와 Altibase5.jdbc.driver.AltibaseDriver 로 구분하여 지정하면 상이한 Altibase 버전 간에 접속하여 사용할 수 있다. 

상이한 Altibase 버전간에 동시 접속하려면, 반드시 Altibase5.jdbc.driver.AltibaseDriver를 먼저 로딩해야 한다.

 

상이한 Altibase 버전간 동시 접속 예제는 다음과 같다.

 


IBM JAVA 1.6 환경 고려사항

IBM Java 1.6 버전의 DriverManager 는 재시도 하지 않고 바로 예외처리를 하는 특성 떄문에 cm protocol version을 포함한 URL 을 연결 스트링에 명시해야 한다. 

IBM Java 1.6 의 DriverManager 의 특성을 고려한 설정 예제는 다음과 같다.

AltibaseMultiversionConnection.java

 

Stored Procedure/Function 호출


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

  1. Stored Procedure

  2. Stored Function

다음은 Stored Procedure와 Function을 호출하는 예제이다.

AltibasePSMCall.java



개발 참고 사항


JAVA 개발 시 참고해야 하는 사항에 대해 설명한다. 

 

PreparedStatement의 사용


PreparedStatement는 SQL 문을 미리 만들어 놓고, 매개변수를 통해 값을 필요시에 binding하여 처리하는 객체이다.

매개변수를 이용하여 binging-excute로 처리가능한 SQL문이라면 PreparedStatement 객체를 사용하는 것이 SQL문을 매번 prepare-execute 방식으로 처리하는 Statement 객체보다 좋은 성능을 제공한다. 예를 들어, n건을 INSERT하는 문장, 특정 값을 조건으로 반복적으로 SELECT하는 문장이라면 PreparedStatement 객체로 만들 것을 권장한다.

 

executeBatch()의 사용


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

Bulk성 DML문 처리 시 executeUpdate() 메소드를 사용하면  메소드 호출 횟수 만큼 DB 서버와 통신 비용이 발생하는 반면,  executeBatch()를 사용하면 DB 서버와의 통신 횟수를 줄일 수 있어 성능을 향상 시킬 수 있다.

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

 

setFetchSize()의 사용


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

하지만 setFetchSize에 지정한 레코드 개수에 비례하여 클라이언트의 메모리가 증가하므로 무작정 setFetchSize의 값을 크게 지정해 주는 것은 좋지 않다.

예를 들어 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() 메소드를 이용할 수 있다.

  • setObject(parameterIndex, null, SQLType.NULL) 메소드 이용
  • setNull(parameterIndex, null) 메소드 이용

 

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

 

LOB 데이터 처리


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

만약 autocommit이 on인 상태에서 LOB 데이터를 처리하면 “Connection is in autocommit mode. One can not operate on LOB datas with autocommit mode on”에러가 발생되거나 혹은 null값이 리턴 되기 때문에 원치 않는 결과가 나올 수 있다.  

JDBC는 default로 autocommit이 on이므로 반드시 Connection의 setAutoCommit(false);를 호출한 후 LOB 데이터를 처리해야 된다.

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

 

REF CURSOR 사용하는 방법


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

 

 


오류 사항


개발 시 자주 마주치게 되는 오류 내용에 대해 설명한다.

 

Communication link failure 


원인

  • DB가 구동이 되어 있지 않은 경우
  • 연결 시 connection 관련 프로퍼티가 잘못된 경우
  • Altibase.jar의 버전이 잘못된 경우 ( 예 : Altibase 5.3.3에 접속하는데 Altibase 5.1.5의 Altibase.jar를 사용한 경우)
  • 서비스 도중 TIMEOUT등으로 연결이 끊겼을 경우

해결방안

  • 연결 시 에러 발생 : DB서버의 IP, port_no, user, password 등 connection 관련 프로퍼티 점검
  • 서비스 도중 에러 발생 : TIMEOUT이 발생하여 해당 세션이 종료되었는지 확인

 

No suitable driver 


원인

  • Altibase JDBC Driver가 잘못되었을 경우에 발생 (예 : Altibase 5 버전에 접속하는데 Altibase 4용 Altibase.jar파일 이용 시)

해결방안

  • Altibase JDBC Driver 재설정

 

Client unable to establish connection 


원인

  • Altibase 서버가 구동되어 있지 않은 경우

해결방안

  • Altibase 서버 구동 여부 확인

 

Timeout 관련 오류


원인

  • 정의된 Timeout 값을 초과한 경우

해결방안

  • Timeout 값 조정
  • 문제해결 가이드 문서 참조

 

클라이언트 프로그램에서 DB 서버로 작업 요청 시 클라이언트 에러 메세지를 리턴 받으며, 서버에는 에러 로그가 기록된다. 

구분클라이언트 에러 메세지서버 에러 메세지 (altibase_boot.log)결과

QUERY_TIMEOUT

Client's query exceeded in the execution time limitation

[Notify : Query Timeout] Query Canceled by Server해당 문장을 ROLLBACK시키고 에러 리턴

FETCH_TIMEOUT

Communication link failure.

[Notify : Fetch Timeout] Session Closed by Server

해당 문장을 ROLLBACK시키고 해당 세션 CLOSE

IDLE_TIMEOUT

Communication link failure.

[Notify : Idle Timeout] Session Closed by Server해당 문장을 ROLLBACK시키고 해당 세션 CLOSE

UTRANS_TIMEOUT

The session has been closed by server.[Notify : UTrans Timeout] Session Closed by Server해당 문장을 ROLLBACK시키고 해당 세션 CLOSE
  • 서버 에러 메세지 위치 : $ALTIBASE_HOME/trc/altibase_boot.log

 

Invalid descriptor index 


원인

  • PreparedStatement에서 지정한 바인드변수 보다 더 많은 값을 setXXX() 호출 시

해결방안

  • 바인드변수 조정

 

Optional feature not implemented 


원인

  • Altibase 에서 제공하지 않는 메소드 호출 시

해결방안

  • JDBC API의 지원여부는 JDBC 매뉴얼 참고

 

 

 

Icon

구 버전 문서: JAVA_개발가이드.pdf (Altibase v5)

 

 

 

 

  • No labels