콘텐츠로 이동

3. 데이터베이스 링크 환경 설정#

이 장은 Altibase 데이터베이스 링크를 사용하기 위해 필요한 환경 설정에 대해 설명한다.

환경 설정에 앞서 데이터베이스 링크가 동작하는 과정을 간략히 살펴보면 다음과 같다.

  1. 사용자가 원격 서버에서 수행될 질의를 포함한 SQL문을 지역 서버에 요청한다.

  2. 지역 서버의 질의 처리기가 SQL문을 파싱하여 원격 서버로 보낼 질의를 준비한다.

  3. 준비된 질의를 AltiLinker로 전송한다.

  4. AltiLinker가 질의를 받아 원격 서버에 질의 수행을 요청한다. 여기에 JDBC 인터페이스가 사용된다.

  5. 원격 서버는 요청 받은 질의를 수행하고 결과를 AltiLinker로 반환한다.

  6. 원격 서버로부터 받은 질의 결과를 AltiLinker가 지역 서버로 전송한다. 지역 서버는 받은 결과 데이터를 용도에 맞게 변환하여 이용한다.

위에서 3번과 6번 단계에서 Altibase 서버와 AltiLinker 간에는 TCP 통신만을 지원하며, 데이터 교환은 ADLP를 따른다. 또한 AltiLinker는 JDBC 인터페이스를 사용하여 원격 서버의 데이터베이스에 접근한다. JDBC 관련 설정은 시스템 환경과 상황에 따라 다를 수 있는데, 이 장에서는 Java SE 1.5 환경을 기준으로 설명한다.


환경 설정#

이 절은 Altibase 데이터베이스 링크 사용을 위한 JDBC 환경 설정 방법을 아래와 같이 설명한다.

  • JRE 설치

  • JDBC 드라이버 설치

  • AltiLinker 프로퍼티 파일 설정

  • 문자 집합(Character Set)

  • Altibase 프로퍼티 파일 설정

JRE 설치#

AltiLinker는 JRE 1.5 버전 이상에서 동작하는 자바 응용 프로그램이므로, AltiLinker가 동작할 장비에 1.5 버전 이상의 JRE가 설치되어 있어야 한다.

AltiLiker가 접속할 원격 데이터베이스의 JDBC 드라이버가 1.5 이상 버전의 JRE에서 동작한다면, 해당 JDBC 드라이버와 호환되는 버전의 JRE를 설치해야 한다.

JRE 설치 후에는 JAVA_HOME과 CLASSPATH 등의 환경 변수를 설정해야 한다. 아래는 유닉스 계열 OS에서 JRE 관련 환경 변수를 설정하는 예제이다.

$ export JAVA_HOME=JRE가 설치된 경로
$ export CLASSPATH=${JAVA_HOME}/lib:${CLASSPATH}
$ export PATH=${JAVA_HOME}/bin:${PATH}

JDBC 드라이버 설치#

데이터베이스 링크를 사용하기 위해 AltiLinker가 동작하는 장비에 JDBC 드라이버를 설치한다. 이 때 설치하는 JDBC 드라이버는 데이터베이스 링크로 접속할 원격 데이터베이스에 해당하는 벤더가 제공하는 것이다. 예를 들어 원격 데이터베이스가 오라클이라면 오라클 홈페이지에서 Oracle 데이터베이스 서버에 일치하는 버전의 JDBC 드라이버를 다운로드하여 설치한다. 2PC(Two-Phase Commit)프로토콜을 사용하는 경우에는 XA를 지원하는 ODBC Driver를 사용해야 한다.

AltiLinker 프로퍼티 파일 설정#

AltiLinker 프로퍼티 파일에는 AltiLinker 동작에 관련된 프로퍼티와 원격 서버에 접속하는데 필요한 프로퍼티가 설정된다.

AltiLinker 프로퍼티 파일은 $ALTIBASE_HOME/conf 아래에 dblink.conf 파일로 존재한다. 이 파일에는 아래의 프로퍼티 등이 설정된다.

  • ALTILINKER_ENABLE

    AltiLinker 프로세스를 활성화하기 위해서는 ALTILINKER_ENABLE 프로퍼티의 값을 1로 설정해야 한다.

  • ALTILINKER_PORT_NO

    ALTILINKER_PORT_NO 프로퍼티에는 AltiLinker의 TCP 대기(listen) 포트 번호를 지정한다.

  • TARGETS

    TARGETS 프로퍼티에는 AltiLinker가 원격 데이터베이스 서버에 접속하는데 필요한 연결 정보가 아래와 같은 하위 프로퍼티로 설정된다.

    • NAME

      접속할 원격 데이터베이스 서버의 이름

    • CONNECTION_URL

      접속할 원격 데이터베이스 서버의 연결 URL

    • USER

      원격 데이터베이스 서버에 접속할 사용자 이름

    • PASSWORD

      원격 데이터베이스 서버에 접속할 사용자의 암호

    • XADATASOURCE_CLASS_NAME

      XADataSource클래스 이름, Altibase.jdbc.driver.AltibaseXADataSource에 위치

    • XADATASOURCE_CLASS_URL_SETTER_NAME

      XADataSource의 URL을 설정(Set), setURL로 설정 가능

    • NLS_BYTE_PER_CHAR

      원격 데이터베이스의 CHAR와 VARCHAR 데이터 타입의 단위와 크기를 지정한다. 이 프로퍼티는 원격 데이터베이스 서버 캐릭터셋을 고려하여 설정한다. 설정하지 않으면 0으로 설정된다.

    NAME, JDBC_DRIVER, CONNECTION_URL은 AltiLinker 프로퍼티 파일에 반드시 명시해야 한다.

    USER, PASSWORD는 AltiLinker 프로퍼티 파일이나 데이터베이스 링크 객체를 생성할 때 입력할 수 있으며 나머지 항목들은 AltiLinker 프로퍼티 파일에만 명시할 수 있다.

    데이터베이스 링크 객체 생성 시점에 명시한 설정이 AltiLinker 프로퍼티 파일 설정보다 우선한다.

    TARGETS 프로퍼티는 아래의 형식으로 설정할 수 있다. 이 프로퍼티에는 복수 개의 원격 서버를 명시할 수 있다.

    TARGETS = (
      (
         NAME = "alti1"
         JDBC_DRIVER = "/home/user/altibase_home/lib/Altibase.jar"
         CONNECTION_URL = "jdbc:Altibase://127.0.0.1:20300/mydb"
         USER = "sys"
         PASSWORD = "manager"
         XADATASOURCE_CLASS_NAME= "Altibase.jdbc.driver.AltibaseXADataSource"
         XADATASOURCE_URL_SETTER_NAME = "setURL"
         NLS_BYTE_PER_CHAR = 1
      ),
      (
         NAME = ..
         JDBC_DRIVER = ..
         CONNECTION_URL = ..
      )
    )
    
    AltiLinker 프로퍼티에 관한 보다 자세한 내용은 "부록 A. 데이터 딕셔너리 및 프로퍼티"를 참고하기 바란다.

문자 집합(Character Set)#

지역 서버의 데이터베이스 캐릭터셋으로 한 글자가 2바이트 이상인 캐릭터셋을 사용하는 경우 TARGETS/NLS_BYTE_PER_CHAR 프로퍼티 설정을 고려해야한다. NLS_BYTE_PER_CHAR 프로퍼티를 고려하지 않은 경우 아래의 상황에서 에러가 발생할 수 있다.

  • REMOTE_TABLE 또는 REMOTE_TABLE_STORE 키워드를 사용하여 원격 서버의 CHAR 또는 VARCHAR 데이터 타입의 데이터를 조회
  • 원격 서버의 CHAR 또는 VARCHAR 데이터 타입의 데이터를 CURSOR를 사용하여 지역 서버에 입력

지역 서버의 CHAR와 VARCHAR 데이터 타입의 한 글자 크기가 원격 서버의 한 글자 크기보다 클 때, 원격 서버의 글자 수에 따라 변환 과정에서 크기 초과로 에러 발생할 수 있다.

변환 과정에서 크기 초과로 에러 발생하는 예제#
  • 지역 서버의 캐릭터셋 UTF8 (한 글자 크기 3바이트)
  • 원격 서버의 캐릭터셋 MS989 (한 글자 크기 2바이트)

    iSQL> EXEC REMOTE_EXECUTE_IMMEDIATE('link1', 'CREATE TABLE t1(c1 CHAR(40), c2 integer)');
    Execute success.
    
    iSQL> EXEC REMOTE_EXECUTE_IMMEDIATE('link1', 'INSERT INTO t1 VALUES(''일이삼사오육칠팔구십일이삼사오'', 3)');
    Execute success.
    
    iSQL> CREATE TABLE T1 ( C1 CHAR( 40 ), c2 integer );
    Create success.
    
    iSQL> CREATE OR REPLACE PROCEDURE PROC1
                AS
                CURSOR CUR1 IS
                SELECT * FROM REMOTE_TABLE(link1,'SELECT * FROM T1 ORDER BY C2');
            BEGIN
                FOR M IN CUR1
                LOOP
                    INSERT INTO T1 VALUES(M.C1, M.C2);
            END LOOP;
            END;
            /
    Create success.
    
    iSQL> SELECT * FROM T1@link1;
    [ERR-C106A : Internal error occurs. (convertNonNullValue : Target data size is biger than column buffer size).]
    
    $T1> EXEC PROC1;
    [ERR-C106A : Internal error occurs. (convertNonNullValue : Target data size is biger than column buffer size).
    In PROC1
    0006 :             FOR M IN CUR1
                      ^
    0007 :             LOOP
    0008 :                 INSERT INTO T1 VALUES(M.C1, M.C2);
    0009 :         END LOOP;
                           ^
    ]
    

Altibase 프로퍼티 파일 설정#

Altibase 데이터베이스 링크를 사용하기 위해서는 먼저 altibase.properties 파일에서 DBLINK_ENABLE 프로퍼티를 1로 설정해야 한다.

모든 프로퍼티 설정 후 Altibase 서버를 구동시키면, AltiLinker 프로세스가 Altibase 서버 프로세스와 함께 시작된다.

데이터베이스 링크와 관련된 프로퍼티에 대한 자세한 내용은 General Reference데이터베이스 링크 관련 프로퍼티를 참고한다.