Detail
'jdbc'Search Results Total 546
AID (Altibase Information Directory)
-
- 2. JDBC Driver 설정ㅣ 2014-12-02
- TOMCAT에서 ALTIBASE JDBC driver를 적절한 곳에 위치시켜 놓아야 ALTIBASE와 연동이 가능하다. ALTIBASE JDBC driver 파일을 얻는 방법 ALTIBASE에서 제공하는 JDBC driver는 Altibase.jar 이다. 이 파일은 ALTIBASE가 설치되
- [Technical Documents(한국어)]
-
- jdbc.trc 파일 생성 위치 변경 방법ㅣ 2015-01-27
- 생성 시기 및 용도 jdbc.trc 파일은 JDBC 관련 trace를 위해 생성하는 로그 파일로, jdbc driver가 초기화 될 때 자동 생성됩니다. 커넥션 URL 에 fail-over를 명시한 경우 fail-over가 발생될 때 event trace 용도로도
- [FAQ(한국어)]
QnA
-
- JDBC pool 사용 관련 ㅣ 2020-09-15
- 안녕하세요. 알티베이스입니다. 문의 사항에 대하여 답변 드립니다. Altibase에서 JDBC pool 지원이 안되는 것인지 ? > Altibase 6.1.1 이하 버전은 JDBC Spec 2를 지원합니다. 해당 Spec 에 맞는 pool 을 사용하시
-
미리보기
안녕하세요. 알티베이스입니다. 문의 사항에 대하여 답변 드립니다. Altibase에서 JDBC pool 지원이 안되는 것인지 ? > Altibase 6.1.1 이하 버전은 JDBC Spec 2를 지원합니다. 해당 Spec 에 맞는 pool 을 사용하시
-
- JDBC 4.0 APIs JDBC 드라이버 지원 관련 ㅣ 2020-09-24
- JDBC 의 공식적인 제공일정은 아래 INC를 통해서 오전중으로 확인해보세요. 서광익 팀장님께 연락해보세여. INC-41532 [다나와] altibase jdbc와 dbcp 버전간의 호환성 관련 문의 #####NEXT##### 알티베이스입니
-
미리보기
JDBC 의 공식적인 제공일정은 아래 INC를 통해서 오전중으로 확인해보세요. 서광익 팀장님께 연락해보세여. INC-41532 [다나와] altibase jdbc와 dbcp 버전간의 호환성 관련 문의 #####NEXT##### 알티베이스입니
Technical Documents
-
- [기사] 메인메모리 DB와의 연결을 위한 ODBC와 JDBC 인터페이스
ㅣ 2012-09-26
- JDBC드라이버의 경로를 지정해야 한다. (2) 운영체제 종속 환경 설정 플랫폼에 따라 운영체제의 세부 특성이 달라지므로, 최적화된 성능을 위해서는, 각 운 영체제 특성에 맞도록 운영체제
-
미리보기
고속 트랜잭션 처리를 위한 효율만점 DB, 메인 메모리 데이터베이스 구축 (2) 메메인인메메모모리리 데데이이터터베베이이스스 설설치치와와 응응용용 프프로로그그램램 작작성성 이번 호에서는 메인메모리 데이터베이스 시스템의 설치 방법과 각 플랫폼에 최적화된 성 능 튜닝을 위한 운영체제 환경 설정을 알아본다. 또한, 적용 업무에 따른 데이터베이스 시 스템을 최적화하기 위해 데이터베이스 관련 프로퍼티를 설정하는 방법과 데이터베이스 관리 툴을 사용한 모니터링을 통해 운영 환경을 최적화하는 방법을 살펴 본다. 마지막으로 메인 메모리 데이터베이스 특성을 활용한 응용 시스템 구축을 위하여, 다양한 프로그래밍 인터페 이스를 이용한 기본적인 프로그램 개발 방법을 알아본다. 연재순서 2002/02 메인메모리 데이터베이스 이해 2002/03 메인메모리 데이터베이스 설치와 응용 프로그램 작성 2002/04 실시간 이중화를 활용한 응용 구축 2002/05 기존 데이터베이스와 연동 응용 구축 현재까지 메인메모리 데이터베이스 시스템은 대형 서버부터 내장형 리눅스 시스템까지 다 양한 플랫폼에 이식되어 있으며, 동일한 프로그램 인터페이스를 통한 응용 프로그램 작성 방법을 사용자에게 제공한다. 그러나, 플랫폼에 따른 운영체제의 특수성이 존재하므로, 최적 의 성능을 위해서는, 설치시 각 운영체제에 종속적인 환경 설정이 필요하다. 이러한 최적화 과정은 메인메모리 데이터베이스 시스템 메이커마다 다르므로, 편의상 알티베이스를 예로 들어 설명한다. 설설치치하하기기 설치는 세 단계로 구성되는데, 먼저 패키지에 포함된 인스톨 프로그램을 실행시켜 필요 한 실행 파일과 라이브러리를 설치하는 단계, 플랫폼에 따른 운영체제별 환경 설정 단계, 데이터베이스 운영 환경 설정 단계로 나뉘어 진다. (1) 프로그램 설치 패키지에는 알티베이스 서버, 각종 유틸리티 프로그램, 프로그램 작성을 위한 라이브러 리, 예제 스키마 및 프로그램, 전자 매뉴얼이 포함되어 있다. 먼저, 데이터베이스 관리용 사 용자를 생성하고, 인스톨 프로그램(install.sh)을 실행시키면, [그림 1] 과 같은 디렉토리 구 조의 홈 디렉토리가 생성된다. $ALTIBASE_HOME bin conf lib includemsg dbs logssample trc audit [그림 1] 홈 디렉토리 구조 주요 디렉토리를 살펴 보면, bin 은 서버를 포함한 실행파일을, conf는 운영환경 설정 프로퍼티 파일을, include와 lib은 응용 프로그램용 헤더파일과 라이브러리를, dbs 는 데이터 베이스 파일을, logs는 로그 파일을, trc는 서버운영 로그를 저장한다. 관리용 사용자와 일반 사용자의 시작 쉘 파일에 서버운영에 필요한 환경변수를 선언한 다. bash쉘을 사용했을 경우, .bashrc 파일에 [그림 2]와 같이 선언한다. $ALTIBASE_HOME 은 알티베이스가 설치된 디렉토리를 지정하는 것으로, 서버를 관리하거나 응용 프로그램을 작성하고 운영할 때, 참조되는 환경변수이다. ALTIBASE_HOME = /home/altiadmin/altibase_home PATH=$PATH:$ALTIBASE_HOME/bin CLASS_PATH=.:$ALTIBASE_HOME/lib/Altibase.jar:$CLASS_PATH LD_LIBRARY_PATH=$ALTIBASE_HOME/lib: $LD_LIBRARY_PAH [그림 2] 환경변수 선언 공유 라이브러리를 사용하는 경우는, LD_LIBRARY_PATH를 지정해야 하며, 자바를 이용 하는 경우는 CLASS_PATH를 통해 JDBC드라이버의 경로를 지정해야 한다. (2) 운영체제 종속 환경 설정 플랫폼에 따라 운영체제의 세부 특성이 달라지므로, 최적화된 성능을 위해서는, 각 운 영체제 특성에 맞도록 운영체제 파라미터를 변경할 필요가 있다. 이러한 파라미터에는 프로 세스당 메모리 한계, 쓰레드 한계, 파일 디스크립터 한계, 공유 메모리 및 세마포어 한계 등 이 있다. 구체적인 설정 방법은 운영체제별로 다르므로, 자세한 내용은 매뉴얼을 참조하길 바란다. (3) 프로퍼티 파일 설정 데이터베이스 관리자는 데이터베이스 시스템의 운영환경을 최적화 필요가 있는데, 이러 한 데이터베이스 성능과 운영에 관한 일반적인 설정은 conf 디렉토리의 altibase.properties 파일에 정의되어 있다. 이 파일에 정의된 각 프로퍼티는 데이터베이스 구성, 세션 연결, 트 랜잭션, 로그, 이중화에 관한 특성을 관리자가 세밀하게 제어할 수 있도록 허용한다. 특히, 관리자는 이 프로퍼티의 설정을 통해 데이터베이스 성능을 최적화 할 수 있다. 몇 가지 주요 프로퍼티를 살펴보면, [그림 3]에서 DB0_DIR, DB1_DIR과 LOG_DIR은 데 이터베이스 파일과 로그 파일을 저장하는 디렉토리를 각각 지정하는 것으로 ? 는 $ALTIBASE_HOME의 dbs와 logs 디렉토리를 지정하는 기본값이다. 필요한 경우, 이들 디 렉토리를 별도의 물리적 디스크로 지정함으로써, 대량의 트랜잭션 처리시 I/O WAIT율을 적 정 수준으로 유지할 수 있다. DB0_DIR=? DB1_DIR=? LOG_DIR=? PORT_NO=20521 MAX_THREAD=1024 MAX_DB_SIZE=4G CHECKPOINT_INTERVAL_IN_SEC=600 REPLICATION_PORT_NO=21521 [그림 3] 프로퍼티 설정 PORT_NO는 클라이언트와의 통신을 위한 포트 번호를 정의하며, REPLICATION_PORT_NO는 이중화 기능을 설정하는 것으로 상대 서버와 이중화 데이터를 송수신 하기위한 전용 포트 번호를 정의한다. MAX_THREAD는 데이터베이스 서비스를 위한 서버측의 서비스 풀을 구성하는 쓰레드 개수를 지정한다. 플랫폼 및 운영환경을 고려하여, 최적의 쓰레드 개수를 지정하는 것이 성 능상 중요하다. 필요한 데이터의 양에 따라 서버는 데이터베이스의 크기를 동적으로 늘리는 데, 관리자는 운영환경에 따라 너무 많은 시스템 자원을 소모하는 것을 막기 위해 MAX_DB_SIZE로 데이터베이스의 최대 한계를 지정할 수 있다. CHECK_POINT_INTERVAL_IN_SEC은 메인메모리 데이터베이스와 디스크 데이터베이스 파일간의 검사점 간격을 지정하는 것으로 I/O 처리율이 낮은 시스템의 경우 이 값을 크게 함으로써, I/O 처리에 따른 시스템 성능 저하를 피할 수 있다. 이외에도 데이터베이스의 성능을 최적화하기 위한 다양한 프로퍼티가 존재하므로, 관리 자는 매뉴얼을 참조하여 시스템에 가장 알맞게 프로퍼티를 설정할 수 있다. 데데이이터터베베이이스스 생생성성과과 삭삭제제하하기기 메인메모리 데이터베이스는 주 데이터베이스가 메인메모리에 위치하며, 1차 백업으로 디스크에 데이터베이스 파일을 유지한다. 따라서, 데이터베이스 생성은 먼저 1차 백업인 데 이터베이스 파일을 생성하는 것으로 시작한다. createdb 유틸리티를 이용해서 생성할 데이터베이스의 크기를 Mbyte 단위로 지정하거 나 페이지 개수로 지정하면, 백업 데이터베이스 파일과 로그앵커 및 초기 로그파일이 생성 된다. 이때, 데이터베이스의 메타 정보를 관리하는 시스템 정의 테이블이 생성된다. [리스트 1]은 100 Mbyte의 데이터베이스를 생성하는 결과이다. shell> createdb -M 100 CreateDB: Release 2.0.0 - Production on Nov 26 2001 10:47:20 (c) Copyright 2001 ALTIBase Corporation. All rights reserved. DB Info (Page Size = 32768) (Page Count = 3200) (File Size = 104857600) Ready for Creating Database [mydb] (y/N) ?y BEGIN: Database Creation .... SUCCESS: Database Creation Completed.. BEGIN: QP Meta Information Creation .... SUCCESS: QP Meta Information Creation Completed. BEGIN: DB Writing (Page Count = 3200) SUCCESS: DB Writing Completed. All Done. shell> [리스트 1] 데이터베이스 생성 메타 테이블은 테이블, 컬럼, 인덱스, 제약조건, 저장 프로시져 등의 정보를 관리하는 테이블로 구성된다. [표 1]은 몇가지 주요 메타 테이블에 대해 설명한다. 메타 테이블 명 설명 qpm_databases_ 데이터베이스 이름 등 데이터베이스 정보를 관리 qpm_users_ 사용자 id, password등 사용자 정보를 관리 qpm_tables_ 테이블명, 사용자 id 등 테이블 정보를 관리 qpm_fields_ 테이블 id, 컬럼명 등 컬럼 정보를 관리 qpm_constraints_ 컬럼 id, 제약조건 타입 등 제약조건을 관리 qpm_indices_ 인덱스 명, 컬럼 id 등 인덱스 정보를 관리 qpm_procedures_ 파라미터 이름, 타입 등 저장 프로시져 정보를 관리 qpm_replications_ 이중화명, 테이블 id 등 이중화 정보를 관리 [표 1] 메타 테이블 데이터베이스를 삭제하는 경우는, destroydb 유틸리티를 사용한다. 이 유틸리티를 실행 하면, 데이터베이스 파일과 관련 로그 파일들을 전부 삭제하게 된다. 서서버버 시시작작과과 종종료료 dbadmin 툴은 서버의 시작(startup)과 종료(shutdown), 모니터링(status) 기능을 수행 하는 유틸리티이다. Startup 명령을 수행했을 때, 서버가 내부적으로 하는 일을 살펴보자. [그림 4]와 같이 서버는 기동을 할 때, ○ 1 altibase.properties 파일에 정의된 데이터베이스 운영환경을 설정하고, ○ 2 데이터베이스 일관성 검사를 통해 서버의 비정상 종료 등으로 인 한 데이터베이스의 손상을 복구하는 회복과정을 수행한다. ○ 3 회복과정에서 서버는 데이터 베이스 파일의 데이터를 바탕으로 로그 파일의 로그를 해석하여 재수행(redo)과 취소(undo) 연산을 수행한다. 데이터베이스의 일관성이 확보되면, ○ 4 디스크에 있는 데이터베이스 파일 을 메모리로 로딩한다. 마지막으로 ○ 5 서비스 쓰레드와 서버 커넥션풀을 초기화하여 서비스 를 수행할 준비를 한다. 알티베이스 서버 ○ 5 ○ 3 ○ 2 ○ 4○ 1 서비스 쓰레드 서버 커넥션풀 데이터베이스 로그 파일 데이터베이스 파일 프로퍼티 파일 [그림 4] 서버 시작 절차 이러한 각 단계별 진행 상황은 커맨드 라인에 상태정보로 출력되며, 관리자는 상태정보 를 분석함으로써, 서버의 문제점을 파악할 수 있다. 예를 들어, 서버가 트랜잭션을 처리하는 중에 비정상적으로 종료한 경우에 서버를 재시작하면, 회복 단계에서 현재 회복중임을 알려 주는 메시지를 볼 수 있다. 또한, 데이터베이스 파일의 물리적인 손상이나, 로그 파일의 손 상등으로 인한 재시작 실패의 원인을 파악할 수 있는 에러 메시지를 볼 수 있다. 운영로그 파일(altibase.log)은 서버 운영중에 발생하는 문제점과 더불어 서버 시작과 종료시의 문제 점을 내부적인 추적 정보를 포함하여 기록해 둔다. 따라서, 관리자는 시작 및 종료 메시지 와 운영로그 파일을 참조하여 서버의 문제에 적절히 대처할 수 있다. Shutdown 명령은 세가지 모드(normal, immediate, abort)를 가지며, 각 모드에 따라 서 버는 종료시 현재 연결중인 클라이언트가 있는지 검사하고, 트랜잭션 테이블을 검사하여 진 행중인 트랜잭션을 철회(rollback)하거나 종료할 때까지 대기한다. 진행중인 트랜잭션이 없 으면, 정상적인 종료 과정을 수행한다. 먼저, 검사점(checkpoint)을 발생시켜, 메모리 데이 터베이스의 변경 내용을 데이터베이스 파일에 반영한 후, 로그와 가비지 관리 쓰레드를 종 료하고, 서비스 쓰레드와 커넥션풀을 해제한다. 서서버버 상상태태 확확인인 관리자는 dbadmin 툴을 이용하여 현재 운영중인 서버의 상태를 확인할 수 있다. 이러 한 상태 정보에는 프로퍼티 정보, 세션 정보, 이중화 정보, 데이터베이스 정보, 메모리 사용 정보 등이 있다. 세션 정보는 현재 연결된 클라이언트의 연결 방법, IP주소 등 연결 정보와 실행중인 statement의 개수를 보여준다. 이중화 정보는 이중화 송신 관리자와 수신 관리자에 대한 연 결 정보 및 이중화 상대 서버의 연결 정보를 포함한다. 데이터베이스 정보는 데이터베이스의 내부적인 정보를 보여주는 것으로, 데이터베이스 버전 번호, 타입, 크기 등의 정보와 데이터베이스에 할당된 메모리 크기와 사용 메모리 크 기가 포함된다. 또한 각 테이블별로 할당된 메모리 크기, 사용 메모리 크기, 메모리 사용률 을 보여준다. 관리자는 메모리 사용률을 분석하여 전체적인 데이터베이스 메모리 사용을 최적화할 수 있다. 할당된 메모리 크기는 크지만, 메모리 사용률이 낮은 경우는 해당 테이블의 메모리 공간을 최적화(compaction)할 필요가 있다. 이것은 테이블에서 레코드가 삭제된 경우 테이 블에 할당된 메모리는 테이블 레벨에서 재사용되기 때문인데, ALTER TABLE table_name COMPACT; 를 수행하면, 테이블의 미사용 공간을 반납하고, 레코드를 재조직한다. [그림 5]를 보면, 데이터의 삭제후 메모리 사용률이 떨어짐을 알 수 있다. 최적화를 수행하면, 테 이블에 할당된 메모리가 데이터베이스로 반납되므로, 데이터베이스 레벨에서 메모리 사용 효율성을 가져올 수 있다. AE ○ 3 65,536 레코드를 삭제한 후 메모리 사용률 Table : T1 Alloc Mem = 3.219M Alloc Page = 103 Alloc Slot = 70246 Used Slot = 4098 Memory Efficiency = 5.83% AE ○ 4 compaction후 메모리 사용률 Table : T1 Alloc Mem = 0.219M Alloc Page = 7 Alloc Slot = 4774 Used Slot = 4097 Memory Efficiency = 85.82% AE ○ 1 최초 T1 테이블의 메모리 사용률 Table : T1 Alloc Mem = 0.031M Alloc Page = 1 Alloc Slot = 682 Used Slot = 1 Memory Efficiency = 0.15% AE ○ 2 69,633 레코드를 삽입한 후 메모리 사용률 Table : T1 Alloc Mem = 3.219M Alloc Page = 103 Alloc Slot = 70246 Used Slot = 69633 Memory Efficiency = 99.13% [그림 5] compaction 사용예 SSQQLL 문문 실실행행하하기기 자 이제부터 SQL문을 이용해 테이블을 생성하고 데이터를 삽입, 삭제, 변경, 조회하는 예를 살펴보자. 먼저, 주지할 점은 SQL92 표준을 지원하고 있기 때문에, 기존의 데이터베 이스 시스템과 거의 같은 수준의 표현력을 가지고 있다는 점이다. 따라서, 사용자는 SQL문 을 충분히 활용하여 데이터를 조작할 수 있다. ISQL은 대화식으로 SQL문을 실행할 수 있는 유틸리티로, 실행의 편의를 위해 히스토리, 스풀 등 부가기능을 제공한다. ISQL을 실행하기 위해서는 서버 IP 주소와 포트번호를 지정 해야 한다. 다음의 명령은 192.168.1.11에서 실행중인 데이터베이스 서버에 포트번호 20521로 연결하는 예이다. isql -S 192.168.1.11 -P 20521 먼저 테이블을 생성해보자. 패키지에서 제공되는 schema.sql과 sample.sql을 실행하면, 샘플로 제공되는 스키마와 SQL문 사용예제를 볼 수 있다. 그 중 EMPLOYEE 테이블을 생 성하는 DDL문을 ISQL에서 실행한 결과는 [리스트 2]와 같다. iSQL> CREATE TABLE EMPLOYEE( ENO integer primary key, ENAME varchar(10) not null, EMP_JOB varchar(15), EMP_TEL nibble(15), DNO bytes(2), SALARY number(10,2) default 0, SEX char(1) default 'M' not null, BIRTH bytes(2), JOIN_DATE date, STATUS CHAR(1) default 'H'); Create Success [리스트 2] DDL문 사용예제 예제의 DDL문을 살펴보면, integer나 varchar와 같이 일반적인 데이터타입 뿐만 아니라 nibble 타입이 있다. nibble 타입은 전화번호와 같이 표현하는 캐릭터의 범위가 제한적일 때 1 바이트에 두 글자씩, 즉 4bit에 데이터를 표현할 수 있으므로, 저장공간을 절약할 수 있는 데이터 타입이다. iSQL> INSERT INTO EMPLOYEE VALUES (5, '홍길동', '개발자', '01145582310', 'D001', 2500000, 'M', '', '20-DEC-99','H'); 1 row inserted. iSQL> SELECT ENO, ENAME FROM EMPLOYEE WHERE EMP_JOB = ‘개발자’; ENO ENAME ----------------------------- 5 홍길동 selected row count [1] [리스트 3] DML문 사용예제 DML문은 데이터를 조작하는 작업을 수행하는데, JOIN 과 SUB-SELECTION 등 다양한 조건에 의한 데이터 수집이 가능하다. [리스트 3]의 예제는 삽입과 검색 연산의 예를 보여 주는 것으로, 컬럼값 뿐만 아니라 테이블명, 컬럼명 등에서도 한글을 사용할 수 있다. 텍텍스스트트 파파일일 업업로로딩딩과과 다다운운로로딩딩하하기기 데이터가 텍스트파일에 일정한 포맷으로 저장되어 있다면, ILOADER 유틸리티를 활용하 여 데이터베이스에 로딩할 수 있고, 테이블에 저장된 레코드를 텍스트 파일로 다운로딩할 수 있다. 이것은 특히 기존의 데이터베이스에서 이식(migration)하는 경우 유용한 기능이다. ILOADER는 대화형 모드 및 명령형 모드로 사용가능하며, 데이터 파일의 포맷을 정의 하는 폼 파일과 데이터 파일, 그리고 테이블 명을 지정하여 로딩한다. 특히, 현재 정의된 테 이블에서 폼 파일을 생성하는 기능을 이용하면, 폼 파일을 수작업으로 정의하는 수고를 덜 수 있다. [리스트 4]는 EMPLOYEE 테이블의 폼파일 생성과 업로딩, 다운로딩을 하는 예제 이다. iLOADER> formout T EMPLOYEE f emp.fmt /* 폼파일 생성 */ iLOADER> in f emp.fmt d emp.dat /* 데이터 업로딩 */ iLOADER> out f emp.fmt d emp.dat /* 데이터 다운로딩 */ [리스트 4] 텍스트 파일 업다운 로딩 응응용용 프프로로그그램램 작작성성 응용 프로그램은 SQLCLI, ODBC, SES C/C ++ 그리고 JDBC 인터페이스를 사용하여 클라 이언트 프로그램을 작성할 수 있으며, 이들은 일반적인 범용 데이터베이스 운영 환경에서의 프로그램 작성법이라 할 수 있다. 각각의 인터페이스를 활용한 응용 프로그램 작성법에 관 하여 살펴 보자. (1) SQLCLI 를 활용한 프로그램 SQLCLI는 응용 프로그램이 데이터베이스 서버와 연결하여 SQL 작업을 처리할 수 있도 록 하는 호출 수준의 인터페이스로, X/OPEN CLI 표준 스펙을 준수한다. CLI API는 응용 작 성에 필요한 환경 정의, 연결 관리, SQL문 처리, 트랜잭션 처리 등에 관련된 기능을 제공하 는 함수들로 구성된다. 먼저, 응용 프로그램을 작성하기 위해서는 include 디렉토리의 헤더 파일(sqlcli.h)을 포함하고 lib 디렉토리의 라이브러리(libodbccli.a )를 링크해야한다. 프로그램은 초기설정, 트랜잭션 처리, 종료, 진단메시시 처리로 구성되며, 각 단계에서 는 다음과 같은 일을 수행한다. [그림 6]은 각 단계별로 적용되는 API를 도표로 보여준다. 초기설정 : 환경 및 연결핸들을 할당하고 초기화 한다. 각 단계에서 다음 단계로의 전환은 적절한 핸들을 전달함으써 이전 단계의 실행 결과에 관한 정보를 전달 하 는 것으로 이루어 진다. 트랜잭션 처리 : 응용 프로그램의 데이터 조작 로직을 구현한다. 종료 : 할당된 핸들을 단절하고 할당되었던 메모리를 회수한다. 진단 메시지 처리 : 진단이란 어플리케이션 내에서 생성된 경고나 오류상태를 처 리하는 것으로, 결과값이 에러일 경우에 진단 메시지를 확인해 볼 수 있다. 특히, 트랜잭션 처리는 SQL문을 직접처리(Direct Execution)하거나, 간접처리(Indirect Execution)하는 방식으로 코딩할 수 있다. 간접처리는 동일한 SQL문 구조에서 실제 바인딩 하는 값만 다른 경우로, 미리 SQL문을 준비(Prepare)하고, 반복적으로 값을 변경하면서 바 Statement Type? DISCONNECT SQLFreeHandle() SQLDisconnect() SQLFreeConnect() SQLFreeEnv() TRANSACT SQLEndTran FETCH ROW COUNT SQLRowCount() FETCH RESULTS SQLNumResultCols() SQLDescribeCol() SQLBindCol() SQLFetch() SQLGetData() EXECUTE Catalog function SQLBindParameter SQLExecDirect INITIALIZE SQLAllocStmt() SQLSetStmtAttr() CONNECT SQLAllocHandle() SQLSetEnvAttr() SQLAllocHandle() SQLConnect() SQLSetConnectAttr() [그림 6] SQLCLI 프로그래밍 단계 인딩하여 실행하는 방식이다. 두 방식간의 차이점은 직접처리는 SQL문을 실행할 때 마다, 서버측에서 파싱(parsing) 검사(validation) 최적화(optimization) 과정을 수행하는 반면, 간접 처리는 이러한 과정을 준비 시점에 한번만 수행한다. 실행 성능만으로 고려하면 간접 처리 방식이 뛰어나므로, 개발자는 업무 특성에 따라 SQL문의 작성과 실행방식을 결정할 필요가 있다. [리스트 5]는 TEST001 이라는 테이블을 생성한 후, 레코드를 insert 하고 select 하는 프로그램으로 주석부분을 잘 살펴보면 각 단계별로 처리하는 방법을 알 수 있다. #include /* SQLCLI 프로그램시 필요한 헤더 파일 */ #include #include #define SQL_LEN 1000 #define MSG_LEN 1024 SQLHENV env; /* Environment를 할당 받을 handle. */ SQLHDBC con; /* Connection을 할당 받을 handle. */ SQLHSTMT st1; /* Statement를 할당 받을 handle. */ SQLHSTMT st2; /* Statement를 할당 받을 handle. */ SQLHSTMT st3; /* Statement를 할당 받을 handle. */ SQLHSTMT st4; /* Statement를 할당 받을 handle. */ void execute_err(SQLHSTMT stat, char* q) { SQLINTEGER errNo; SQLSMALLINT msgLength; SQLCHAR errMsg[MSG_LEN]; printf("Error : %s\n",q); if (SQL_SUCCESS == SQLError ( env, con, stat, NULL, rMsg, MSG_LEN, )) { printf(" Error : # %ld, %s\n", errNo, errMsg); /* 진단 메시지 처리 부분, SQL 수행 후 반환값이 SQL_ERROR 일 경우 SQLError API 를 사용해서 진단을 할 수 있다. */ } SQLFreeStmt(st1, SQL_DROP); SQLFreeStmt(st2, SQL_DROP); SQLFreeStmt(st3, SQL_DROP); SQLFreeStmt(st4, SQL_DROP); if (SQL_ERROR == SQLDisconnect(con)) { printf("disconnect error\n"); } SQLFreeConnect(con); SQLFreeEnv(env); exit (1); } int main(int argc,char **argv) { char query[SQL_LEN]; int PORT_NO, age; char *USERNAME, *PASSWD, *NLS, connStr[1024], name[22]; SQLINTEGER len, name_ind, age_ind; if ( argc < 2 ) { printf("Usage : %s port_no \n",argv[0]); exit(1); } PORT_NO = atoi(argv[1]); /* 서버의 접속 Port 번호. */ USERNAME = "SYS"; /* 사용자명. */ PASSWD = "MANAGER"; /* 사용자 암호. */ NLS = "US7ASCII"; /* 사용언어 ( KO16KSC5601, US7ASCII ) */ /* Altibase Server에 접속 */ /* Environment 을 위한 메모리를 할당 */ if (SQL_ERROR == SQLAllocEnv( printf("SQLAllocEnv error!!\n"); exit(1); } /* Connection 을 위한 메모리를 할당 */ if (SQL_ERROR == SQLAllocConnect(env, printf("SQLAllocConnect error!!\n"); SQLFreeEnv(env); exit(1); } /* Altibase DBMS 로 연결하는 데 필요한 값을 설정한다 */ sprintf(connStr, "DSN=127.0.0.1;UID=%s;PWD=%s;CONNTYPE=%d;NLS_USE=%s;PORT_NO=%d", USERNAME, PASSWD, 1, NLS, PORT_NO); /* Connection을 형성, 실제로 DBMS 로 연결을 하는 부분이다. */ if (SQL_ERROR == SQLDriverConnect( con, NULL, connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT )) { printf("connection error\n"); SQLFreeEnv(env); exit(1); } /* Statement을 위한 메모리를 할당, Statement 는 SQL 문 수행을 담당하는 핸들이다. */ if (SQL_ERROR == SQLAllocStmt(con, printf("SQLAllocEnv error!!\n"); SQLFreeEnv(env); exit(1); } /* Statement을 위한 메모리를 할당 */ if (SQL_ERROR == SQLAllocStmt(con, printf("SQLAllocEnv error!!\n"); SQLFreeEnv(env); exit(1); } /* Statement을 위한 메모리를 할당 */ if (SQL_ERROR == SQLAllocStmt(con, printf("SQLAllocEnv error!!\n"); SQLFreeEnv(env); exit(1); } /* Statement을 위한 메모리를 할당 */ if (SQL_ERROR == SQLAllocStmt(con, printf("SQLAllocEnv error!!\n"); SQLFreeEnv(env); exit(1); } /* 쿼리 직접수행 */ /* SQLExecDirect 는 서버로 직접 SQL문을 전송하고 바로 결과를 받아 온다. */ sprintf(query,"DROP TABLE TEST001"); SQLExecDirect(st1,query, SQL_NTS); sprintf(query,"CREATE TABLE TEST001 ( name varchar(20), age integer )"); if (SQL_ERROR == SQLExecDirect(st2,query, SQL_NTS)) { execute_err(st2, query); } /* Statement를 준비하고 변수를 바인드한다. */ /* SQLPrepare 는 서버로 SQL 문을 전송하면 서버에서 쿼리 파싱,최적화 과정을 거쳐 준비를 해 두고, SQLExecute 을 통해서 호스트 변수 값만 변경하면서 수행을 할 수 있다. 이는 동일한 쿼리의 반복 수 행시 빠른 결과를 보장할 수 있다. */ sprintf(query,"INSERT INTO TEST001 VALUES( ?, ? )"); if (SQL_ERROR == SQLPrepare(st3, query, SQL_NTS)) { execute_err(st3, query); } SQLBindParameter(st3, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, sizeof(name), 0, name, 0, SQLBindParameter(st3, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, 0, en); /* DB로 입력할 값들의 버퍼를 바인딩 하는 부분 */ /* 준비된 Statement를 수행 */ len = SQL_NTS; sprintf(name, "홍길동"); age = 25; if (SQL_ERROR == SQLExecute(st3)) { execute_err(st3, query); } sprintf(name, "차돌이"); age = 34; if (SQL_ERROR == SQLExecute(st3)) { execute_err(st3, query); } sprintf(query,"SELECT * FROM TEST001"); if (SQL_ERROR == SQLExecDirect(st4,query, SQL_NTS)) { execute_err(st4, query); } /* Select의 결과값을 저장할 변수를 설정한다. */ SQLBindCol(st4, 1, SQL_C_CHAR, name, sizeof(name), SQLBindCol(st4, 2, SQL_C_SLONG, ge_ind); while (SQLFetch(st4) == SQL_SUCCESS) /* 결과값이 있는 동안 결과값을 받아 화면에 출력 */ { printf("Name : %5s, Age : %5ld\n",name,age); } /* 모든 handle을 해제하고 접속을 종료 */ SQLFreeStmt(st1, SQL_DROP); SQLFreeStmt(st2, SQL_DROP); SQLFreeStmt(st3, SQL_DROP); SQLFreeStmt(st4, SQL_DROP); /* DBMS 로부터의 연결을 해제한다. */ if (SQL_ERROR == SQLDisconnect(con)) { printf("disconnect error\n"); } SQLFreeConnect(con); SQLFreeEnv(env); } [리스트 5] SQLCLI 예제 프로그램 (2) ODBC를 활용한 프로그램 Microsoft 의 Open Database Connectivity (ODBC) 인터페이스는 산업 표준으로 SQLCLI 의 확장된 스펙이라고 할 수 있다. ODBC 인터페이스는 응용 프로그램을 동일한 인터페이스로 다양한 DBMS로 접근하는 것을 가능하게 한다. 응용 프로그램 사용자는 프로 그램과 특정 DBMS 간의 인터페이스인 소프트웨어 콤포넌트(ODBC드라이버)를 설치해야 한 다. ODBC를 이용하기 위해서는 먼저 패키지에서 제공하는 설치 프로그램(setup.exe)으로 ODBC 드라이버를 설치한다. 다음 제어판에서 ODBC 관리도구를 통하여 DSN 을 추가한다. [그림 7]과 같이 제어판 -> 관리 도구 -> ODBC 데이터 원본 관리자에서 추가를 선택한 후 1에서 설치된 Altibase 드라이버를 선택한다. 연결 환경 설정 창에서 호스트 IP, 포트 번 호 등을 입력한 후 DSN 을 등록한다 [그림 8]. [그림 7] ODBC 드라이버 설정 [그림 8] DSN 등록 과정 이제 등록된 ODBC드라이버를 통해 서버에 연결하여 데이터를 가지고 오는 테스트를 해보자. [그림 9]는 Visual Basic의 비주얼 데이터 관리자를 실행시켜 샘플 스키마에 정의된 orders 테이블을 검색한 결과이다. [그림 9] 비주얼 데이터 관리자를 통해서 알티베이스에 연결하기 ODBC드라이버 테스트가 끝났으면, 이제 비주얼 베이직에서 ADO Data Contol 과 Data Grid Contol 을 사용해서 테이블을 조회하는 프로그램을 작성해 보자. [그림 10]은 ADO오 브젝트를 활용하여 데이터베이스 커넥션을 정의하고, ORDERS 테이블을 지정하여 레코드를 가져오는 간단한 예제 프로그램이다. 먼저 ADO Data Contol을 생성하여 알티베이스 ODBC 드라이버를 선택하고, 연결 문자열 설정과 검색할 테이블을 지정하고 이름을 Adoc1으로 지 정한다 [그림 10]. DataGrid 오브젝트를 생성하여 DataSource를 Adoc1으로 지정하고 폼에 위치를 정한다 [그림 11]. 프로그램을 실행하면 [그림 12]와 같이 서버에 연결하여 ORDERS 테이블에서 레코드를 가지고 온다. [그림 10] ADO 오브젝트 속성 지정 [그림 11] DataGrid 오브젝트 속성 지정 [그림 12] Visual Basic으로 작성한 간단한 예제 (3) SES C/C++를 활용한 프로그램 SES C/C++는 소스 프로그램(확장명 sc) 을 입력으로 받아, 소스 프로그램 내에 있는 SQL 문장(내장 SQL 문장)들을 라이브러리 호출 형태의 코드로 변환된 파일을 생성하여, C/C++ 컴파일러로 컴파일될 수 있도록 변환하는 전처리기(precompiler)이다. 이는 개발자 로 하여금 간단한 내장 SQL 문을 사용하여 응용 프로그램을 작성할 수 있도록 하여, 개발 비용을 절감하는 효과를 기대할 수 있다. 알티베이스의 SES C/C++ 은 Oracle 의 Pro*C/C++ 과 유사하여 기존의 개발자들에게는 친숙할 것이다. 먼저, 응용 프로그램을 작 성하기 위해서는 lib 디렉토리의 libsesc.a와 libodbccli.a를 링크해야한다. 전처리기는 다음과 같이, 소스 파일을 지정하여 실행한다. 이때, 소스 코드에 따라 C와 C++을 지정할 수 있으며, 개발자가 정의한 위치의 헤더파일을 포함하도록 지정할 수 있다. sesc [-h] [-t ] [-include pathname] source_file SQLCLI 설명에서 작성했던 예제를 내장 SQL 소스로 변경하여 비교해 보도록 하자 [리 스트 6]. 먼저, 눈에 뛰는 것은 SQLCLI와 달리 복잡한 환경 설정과 메모리 할당 등의 번거 로운 작업이 없다는 점이다. 이것은 전처리기 자동적으로 코드를 생성해주기 때문이다. 또 한, 개발자는 내장 SQL문 처리를 통해 업무 로직에만 집중할 수 있다는 점도 장점이다. 전 처리기는 개발자의 소스코드를 분석하여 최적화 과정을 통해 SQLCLI로 직접 작성한 경우와 거의 대등한 성능을 보이는 코드로 변환한다. /* 호스트 변수 선언 */ EXEC SQL BEGIN DECLARE SECTION; char USERNAME[50]; char PASSWD[50]; char connStr[1024]; char name[22]; int age; int name_ind; int age_ind; EXEC SQL END DECLARE SECTION; void execute_err(char* q) { printf("Error : %s\n",q); printf(" Error : # %ld, %s\n", SQLCODE, sqlca.sqlerrm.sqlerrmc); /* 진단 메시지 처리 부분, SQL 수행 후 반환값이 SQL_ERROR 일 경우 SQLError API 를 사용해서 진단 을 할 수 있다. */ EXEC SQL DISCONNECT; exit (1); } int main(int argc,char **argv) { int PORT_NO; char NLS[50]; if ( argc < 2 ) { printf("Usage : %s port_no \n",argv[0]); exit(1); } PORT_NO = atoi(argv[1]); /* 서버의 접속 Port 번호. */ strcpy(USERNAME, "SYS"); /* 사용자명. */ strcpy(PASSWD, "MANAGER"); /* 사용자 암호. */ strcpy(NLS, "US7ASCII"); /* 사용언어 ( KO16KSC5601, US7ASCII ) */ /* Altibase Server에 접속 */ /* Altibase DBMS 로 연결하는 데 필요한 값을 설정한다 */ sprintf(connStr, "DSN=127.0.0.1;CONNTYPE=%d;NLS_USE=%s;PORT_NO=%d", 1, NLS, PORT_NO); /* Connection을 형성, 실제로 DBMS 로 연결을 하는 부분이다. */ EXEC SQL CONNECT :USERNAME IDENTIFIED BY :PASSWD USING :connStr; if (sqlca.sqlcode == SQL_ERROR) { printf("connection error\n"); exit(1); } /* SQL문 수행 */ EXEC SQL DROP TABLE TEST001; EXEC SQL CREATE TABLE TEST001 ( name varchar(20), age integer); if (sqlca.sqlcode == SQL_ERROR) { execute_err(“create table…”); } sprintf(name, "홍길동"); age = 25; /* SQLCLI 에서 SQLBindParameter 과정을 통해서 변수를 바인딩했던 과정을 호스트 변수를 써서 간단하 게 작성할 수 있다. */ EXEC SQL INSERT INTO TEST001 VALUES( :name, :age); if (sqlca.sqlcode == SQL_ERROR) { execute_err(“insert into table…”); } sprintf(name, "아무개"); age = 34; EXEC SQL INSERT INTO TEST001 VALUES( :name, :age); if (sqlca.sqlcode == SQL_ERROR) { execute_err(“insert into table…”); } EXEC SQL DECLARE test_cursor CURSOR FOR SELECT * FROM TEST001; if (sqlca.sqlcode == SQL_ERROR) { execute_err(“declare cursor…”); } EXEC SQL OPEN test_cursor; if (sqlca.sqlcode == SQL_ERROR) { execute_err(“open cursor…”); } while (1) /* 결과값이 있는 동안 결과값을 받아 화면에 출력 */ { EXEC SQL FETCH FROM test_cursor INTO :name indicator :name_ind, :age indicator :age_ind; /* SQLCLI에서 SQLBindCol을 통하여 바인딩하는 것을 호스트 변수와 indicator로 작성할 수 있다. */ if (sqlca.sqlcode == SQL_NO_DATA) break; printf("Name : %5s, Age : %5ld\n",name,age); } EXEC SQL DISCONNECT; /* DBMS 로부터의 연결을 해제한다. */ } [리스트 6] SES C/C++로 작성한 예제 프로그램 (4) JDBC 를 활용한 프로그램 JDBC API는 SQL문들을 JDBC 인터페이스들에 있는 메쏘드의 인수로서 사용할 수 있 게 해 주는 SQL레벨의 API이다. JDBC API는 개발자들이 데이터베이스 문제에 전혀 신경 쓸 필요가 없이 업무 로직만 구현할 수 있도록 해 준다. 알티베이스 JDBC 드라이버는 자바 소프트에서 분류한 드라이버 유형 중 4번째 타입을 지원한다. 타입 4는 네트워크 프로토콜 을 통하여 데이터베이스 서버와 직접 통신하는 방식으로 100 % 순수 자바로 제작되었다. JDBC 드라이버는 lib 디렉토리에 Altibase.jar라는 이름으로 설치된다. 따라서, 개발자 는 환경변수 CLASS_PATH에 JDBC 드라이버 경로를 지정해야 한다. 응용 프로그램에서 드 라이버를 로드하는 방법은 [리스트 7-1]과 같다. 드라이버를 등록한 후, 데이터베이스 URL, 사용자 이름, 패스워드를 지정하여 DriverManger로부터 Connection 객체를 획득한다 [리스 트 7-2]. URL 지정 방식은 jdbc:Altibase://host명:port_no/dbname와 같이 한다. [1] Class.forName(“Altibase.jdbc.driver.AltibaseDriver”); [2] Connection con = DriverManager.getConnection(“jdbc:Altibase://localhost:20222/dbname”,“SYS”, “MANAGER”); [리스트 7] JDBC 드라이버 등록과 객체 획득 이제 자바 개발툴인 Jbuilder에서 알티베이스 JDBC 드라이버를 등록하고 사용하는 방 법을 알아보자. Tools -> Configure Libraries 메뉴에서 New를 선택하여 Class탭에 Altibase JDBC Driver를 추가하고, Required Libraries 탭을 선택하여 같은 방식으로 추가한다 [그림 13]. [그림 13] JBuilder에서 JDBC 드라이버 등록 Tools -> Enterprise Setup 메뉴를 선택하고 Database Drivers 탭에서 위에 등록한 라 이브러리를 추가한다 [그림 14]. [그림 14] JBuilder의 Enterprise Setup에서 JDBC 드라이버 등록 이제 JDBC 드라이버가 제대로 등록되었는지 Database Pilot을 실행시켜 테스트하자. 먼저 Options -> Drivers에서 Altibase JDBC Driver를 추가하고 URL을 지정하고 [그림 15], File -> New 를 통해서 새로운 DB 연결을 생성하고 서버로 연결을 시도한 후에, Enter SQL 탭에서 ODBC 드라이버 테스트와 같은 방식으로 SQL문을 테스트한다. [그림 15] JBuilder의 Database Pilot에서 JDBC 드라이버 등록 SQLCLI 설명에서 작성했던 예제를 JDBC를 이용한 자바 프로그램으로 변경하여 비교 해 보도록 하자 [리스트 8]. 소스 코드를 살펴보면, 기존의 데이터베이스 응용 프로그램과 동일함을 알 수 있다. 즉, JDBC 드라이버를 정확히 등록하면 이후의 과정은 기존의 방식과 크게 다른점이 없다. import java.sql.*; class JdbcTest { public static void main(String args[]) { Connection con = null; Statement stmt = null; PreparedStatement pstmt = null; ResultSet res; if ( args.length == 0 ) { System.err.println("Usage : java JdbcTest port_no \n"); System.exit(1); } String port = args[0]; String url = "jdbc:Altibase://192.168.1.11:" + port + "/mydb"; String user = "SYS"; String passwd = "MANAGER"; /* 알티베이스 JDBC 드라이버 등록 */ try { Class.forName("Altibase.jdbc.driver.AltibaseDriver"); } catch ( Exception e ) { System.err.println("Can't register Altibase Driver"); return; } /* 접속하고 Statment를 할당. */ try { con = DriverManager.getConnection(url, user, passwd); stmt = con.createStatement(); } catch ( Exception e ) { e.printStackTrace(); } /* SQL문 수행 */ try { stmt.execute("DROP TABLE TEST001"); } catch ( SQLException se ) { } try { stmt.execute("CREATE TABLE TEST001 ( name varchar(20), age number(3) )"); pstmt = con.prepareStatement("INSERT INTO TEST001 VALUES(?,?)"); pstmt.setString(1,"홍길동"); pstmt.setInt(2,25); pstmt.execute(); pstmt.setString(1,"아무개"); pstmt.setInt(2,34); pstmt.execute(); res = stmt.executeQuery("SELECT * FROM TEST001"); /* 결과를 받아 화면에 출력 */ while(res.next()) { System.out.println(" Name : "+res.getString(1)+", Age : "+res.getInt(2)); } /* 연결 해제 */ stmt.close(); pstmt.close(); con.close(); } catch ( Exception e ) { e.printStackTrace(); } } } [리스트 8] JDBC를 이용한 예제 프로그램 이번 호에서는 알티베이스를 설치하는 방법과 플랫폼 및 운영환경에 최적화된 성능을 얻기 위해 환경 설정 방법을 설명하였다. 또한, 각종 유틸리티를 사용하여 관리자가 데이터 베이스를 생성하고 삭제하는 방법과 서버를 시작하고 종료하는 방법을 알아보았다. 마지막 으로 동일한 내용의 프로그램을 다양한 프로그래밍 인터페이스를 이용해 예제 프로그램을 개발하는 연습을 해보았다. 다음 호에서는 주식 시세 구축사례를 통해 이중화 기능의 원리 와 이중화를 활용하여 전체적인 생산성과 가용성을 확대할 수 있는 응용의 구조와 개발 방 법을 살펴볼 예정이다. 본 연재에 대한 질문은 ㈜알티베이스의 홈페이지나 전자메일을 통해 하기 바란다.
- [기사] 메인메모리 DB와의 연결을 위한 ODBC와 JDBC 인터페이스
-
- [기사] MMDBMS의 등장 배경
ㅣ 2012-09-26
- JDBC, ESQL (Embedded SQL)를 지원하므 로 DR DBMS 개발방식과 유사한 방식으로 데이터베이 스 애플리케이션 개발이 가능하다. 통신 계층(Communication Layer)은 데이터베이스 클라이언트 프로그램들과
-
미리보기
154 June2006 LECTURE│ 하이브리드 DBMS 1 연■ 재 ■ 순 ■ 서 1. MM DBMS의 등장(2006년 6월호) 2. MM DBMS 활용 사례(2006년 7월호) 3. DBMS의 새로운 대안, 하이브리드 MM DBMS (2006년 8월호) 최 근 한 업체가 하드디스크 대신 플래시메 모리를 저장장치로 이용해 데이터 액세스 속도는 높이고 부팅속도를 절반으로 줄인 노트북을 전시회에 출품해 화려한 스포트라이트를 받 았다. 이는 노트북 업계에서도 HDD를 보조하는 저장 장치로서가 아닌, 느린 하드디스크를 대체하는 주 저 장매체로서 메모리의 가능성을 타진하고 있음을 시사 한다. 이외에도 다양한 분야에서 메모리를 단순히 프로그 램을 실행하기 위한 임시 저장공간이 아니라 데이터를 저장하기 위한 용도로 활용하기 위한 노력들이 확대되 고 있다. 이는 메모리가 빠른 액세스 속도와 저전력, 소형화 등과 같이 저장 매체로서 매력적인 장점을 가 지고 있기 때문이다. 데이터를 저장하고, 관리해야 하는 DBMS 분야도 예외는 아니다. 이미 오래 전부터 메모리를 저장 매체 로 이용하기 위한 연구와 노력이 진행돼 왔고, 수 년 전부터는 메인 메모리 DBMS(Main Memory DBMS, 이하 MM DBMS)라는 제품으로 등장했다. 비싼 메모리 가격으로 인한 높은 구축비용으로 소규 모의 실시간 시스템에만 제한적으로 사용돼 왔던 초기 와 달리, 최근에는 대용량 데이터베이스로서 사용되는 등 사용 범위가 크게 확대됐다. 불과 몇 년만에 MM DBMS가 범용 DBMS로 자리매김할 수 있었던 것은 메모리 가격의 하락과 본격적인 64비트 운영체제 시대 의 도래로 이용 가능한 메모리 용량이 무한대로 확장 된 점에 기인한다. 게다가 최근에는 RTE, 유비쿼터스 컴퓨팅, 와이브 로, 텔레매틱스, RFID 등 새롭게 등장하는 용어나 서 비스들마다 실시간 데이터 처리에 기반하고 있어 향후 MM DBMS에 대한 관심과 수요는 폭발적으로 증가 할 것으로 전망된다. MM DBMS의 등장 배경과 개요 MM DBMS(Main Memory DataBase Manage ment System)는 데이터베이스를 메모리에 상주시켜 운영하는DBMS로, 업체별로 메모리 DBMS, MMDB(Main Memory Database), In-Memory Database System, in-Main Memory Database, 메 모리 데이터베이스 등으로 다양하게 불리지만, 데이터 베이스를 메모리에 상주시켜 이용한다는 동일한 개념 을갖고있다. 앞에서도 잠시 언급했듯이 MM DBMS란, 데이터 베이스의 일부 또는 전부를 메인 메모리에서 관리하는 DBMS로, 디스크에 대한 접근없이 직접 메모리 접근 을 통해 데이터를 관리하므로 고성능 데이터베이스 처 MM DBMS의 등장 배경 최근 전 산업분야에 걸쳐 TCO 절감과 ROI 극대화가 화두로 떠오르는 가운데, DBMS 분야에서도 저비용 고효율 데 이터베이스 구축에 대한 해법을 제시하는 하이브리드형 DBMS가 등장, 새롭게 각광받고 있다. 이번 호부터 총 3회 에 걸쳐 하이브리드 MM DBMS와 그 전신인 MM DBMS의 등장 배경에서부터 개요와 특성, 아키텍처, 활용사례 등 을 짚어봄으로써 하이브리드 MM DBMS에 대한 독자들의 이해를 돕고자 한다. 신범수 omegaman@altibase.com 알티베이스 기술지원실 차장 154-159_06_강좌-DBMS 2006.5.27 7:45 PM 페이지154 MAC52 2400DPI 175LPI 리를 가능하게 하는 데이터베이스 관리 기술이다. MM DBMS가 소개되고 본격적으로 활용된 지는 5년여 남짓밖에 되지 않지만, 1990년대 초반부터 국내 학계와 산업계를 중심으로 다 양한 연구가 진행돼 왔다. 국내 대학과 한국전자통신연구원(ETRI)이 공동으로‘실시간 처리 DBMS(MR.RT)’라는 과제로 수 년간 연구를 했던 것이 대표적인 사례다. 당시 개발된 MM DBMS는 자료저장 시스템 수준에 불과했지만, 그 결과 많은 DBMS 개발 인력들이 양성될 수 있었다. 이들은 1990 년대 후반에 나타난 인터넷의 대중화와 이동통신의 폭발적인 증가로 실시간 데이터 처리에 대한 요구가 늘어나면서 주요 MM DBMS 업 체에 참여해 상용 MM DBMS를 탄생시키는 산파 역할을 담당하게 됐다. 이와 같이 장기적이고 지속적인 연구 개발에 힘입어 MM DBMS 에 대한 연구나 개발 활용 측면에서 우리나라는 이미 세계적인 수준 에 이르렀으며, 토종 업체들이 관련 시장을 주도하고 있다. 백신, 그 룹웨어 등과 같은 애플리케이션 분야에서 토종 업체들이 국내 시장을 중심으로 주도권을 잡는 경우는 종종 있기는 하지만, 기간 소프트웨 어이자 기술 진입 장벽이 높은 DBMS 시장에서 토종 업체가 주도권 을 잡고 있다는 것은 매우 이례적인 일로 받아들여진다. 이는 진입 장 벽과 외산 의존도가 높은 분야라도 시장과 고객의 요구를 정확히 예 측해 품질과 서비스를 겸비한다면 토종 제품이라도 충분히 시장을 선 도할 수 있음을 시사한다. MM DBMS의 적용분야 MM DBMS의 적용분야를 살펴보면, 우리의 일상생활과 매우 밀 접하게 연관돼 있음을 알 수 있다. 소규모 실시간 데이터 처리를 위한 시스템에만 한정적으로 적용되던 초기와는 달리, 포털 사이트의 인증 에서부터 증권사의 HTS(Home Trading System), 휴대폰 이용을 위 한 HLR(Home Location Register)에 이르기까지 다양한 분야의 실 생활 속에서 폭넓게 활용되고 있다. MM DBMS가 시장에 본격적으 로 등장한 지 불과 몇 년 밖에 되지 않았다는 사실을 감안할 때, 단시 간 내에 고객의 신뢰를 얻어 범용 DBMS로 성장할 수 있었던 것은 다 음과 같은 여건들이 성숙됐기 때문이다. ·실시간 데이터 처리 요구 증가 기업의 정보시스템 환경이 웹 기반으로 전환되고, 인터넷이 대중화 되면서 고성능/대규모 트랜잭션 처리 요구가 전 산업 분야에서 크게 증대되고 있다. 특히 통신이나 금융분야는 고객과 정보관리에 있어서 실시간 데이터 관리가 필수 불가결한 요소이다. 온라인 서비스 환경 이 일반화되고 동시 사용자 수는 과거에 비해 비약적으로 증가하고 고객의 기대 수준 역시 높아졌다. 몇 년 전만 하더라도 기업들은 사용자의 시스템 액세스 패턴을 예 측할 수 있었기 때문에 사전에 시스템 증설 계획이나 피크 타임에 대 한 방안을 마련해 최상의 속도를 제공하기에 무리가 없었지만, 이제 는 얼마나 많은 사용자가 동시 접속할 것인지, 그리고 특정 시간대에 집중될 것인지 아무 것도 예견할 수 없는 상황에 봉착하고 있다. 그럼 에도 불구하고 기업들은 언제 어디서나 수시로 접속해 시스템을 사용 할 지 모르는 사용자들을 위한 서비스 품질 보장 방안을 마련해야 하 는 이중고를 겪고 있다. 결국 기업들은 이런 고객들의 요구를 충족시 키기 위해 피크타임에도 사용자들에게 최상의 처리속도를 제공할 수 있도록 실시간 데이터 처리 방안에 눈을 돌리게 된 것이다. ·기존 DBMS의 처리 성능 한계 고객의 변화하는 요구에 부합하기 위해서는 데이터는 일반적으로 지속적으로 증가하고 다양한 형태로 가공되고 시스템은 복잡 대형화 된다. 오라클, DB2, MS SQL과 같은 일반 디스크 상주형 DBMS (Disk Resident DBMS, 이하 DR DBMS)는 대용량 데이터 처리에 적합하나 대용량 데이터의 초고속 처리에는 그 한계를 드러내곤 한 다. DR DBMS는 버퍼 캐시를 통해 느린 디스크 성능을 보완하는 구 조를 갖고 있다. 그러나 사용자의 선택에 따라서 버퍼 캐시에 상주시킬 데이터를 선 택하는 것이 아니라, 데이터의 접근 빈도에 따라서 DR DBMS가 판 단한다. 이 때문에 데이터의 운용상태에 따라 실시간 처리의 중요도 가 낮은 데이터가 버퍼 캐시를 점유해 정작 실시간 처리가 필요한 데 이터의 버퍼 미스(Buffer Miss Ratio)를 유발해 기대 효과를 얻지 못 할수가있다. 이런 문제 해결을 위해서 어떤 기업에서는 실시간 처리용 소프트웨 어를 자체 개발해 사용하기도 했다. 일례로 일찍부터 증권업계에서는 고속 처리가 필요한 소규모의 데이터를 메모리에 저장하고 관리하기 위한 다양한 솔루션을 개발해 이용했다. 그러나 여전히 산업표준, 높 은 가용성, 실시간 처리능력, 확장 가능한 구조를 동시에 만족시키는 DB 시스템이 절실히 요구돼 왔고, 최근 증권 분야의 MM DBMS 활 ontheNET 155 HLR Home Location Register. 이동통신 표준화 단체인 TR-45.2 분과위에서 제정한 IS-41 규격에 서 사용되는 요소로, HLR는 이동통신망에서 제어와 지능을 제공하기 위한 가입자 정보의 중앙 집중적 데이터베이스의 저장소를 말한다. 이는 가입자가 가입한 서비스 지역의 홈 데이터베이 스이며, 이동통신업체가 관리한다. HLR에는 해당 가입자의 위치 정보, 가입자 상태, 서비스 공 유 및 가입자 전화번호 등이 보관된다.Home Location Register. 무선 통신 교환기에서 사용되는 데이터베이스. 가입자에 대한 단말기, 서비스, 고객 위치 정보 등의 정보를 유지하며, 대용량의 실시간 데이터베이스를 갖추고 망에서 요구하는 가입자에 대한 정보를 처리해주며 이들의 유 기적 결합을 통해 가입자에게 이동성을 보장한다. 용■ 어 ■ 설 ■ 명 154-159_06_강좌-DBMS 2006.5.27 7:45 PM 페이지155 MAC52 2400DPI 175LPI 용 사례에서 살펴볼 수 있듯이 MM DBMS가 그 확실한 대안이 되고 있다. ·메모리 가격 하락과 64비트 운영체제 등장 반도체 칩의 집적도가 향상되고 대량생산을 통해 메모리 가격이 지 속적으로 하락하면서 대용량 메모리를 장착한 시스템의 구성이 쉬워 졌다. 32비트 운영체제는 메모리 어드레싱 한계로 인해 사용 가능한 최대 메모리 크기가 4GB기 때문에 MM DBMS가 대용량 데이터베 이스로 업무영역을 확장하는 데 걸림돌이 됐다. 그러나 메모리 가격 하락과 64비트 운영체제가 보편화되면서 최근 에는 512GB까지 메모리를 장착할 수 있는 시스템이 등장했다. 이런 환경의 변화를 통해 MM DBMS가 지원하는 최대 데이터베이스 용량 이 커질 수 있는 유리한 여건이 조성되면서 그 적용분야도 점차 다양 화되고 있다. ·고객의 마인드 변화 과거 첨단 정보 시스템이라면 앞다퉈 도입하던 기업들은 이제 기업 의 비즈니스 기회 창출에 반드시 필요한 것인지 꼼꼼히 따져본 후 도 입을 검토하고, TCO(Total Cost of Ownership)와 ROI(Return of Invest) 측면에서 정량화된 효과를 측정 가능한 시스템만을 선별해 투자를 집행하려는 움직임이 두드러지게 나타난다. 과거에는 외산이냐, 국산이냐 또는 어떤 브랜드이냐가 중요한 선택 의 기준이었지만, 이제는 어떤 제품이 더 뛰어난 성능과 신뢰성을 제 공하는지, 제대로 된 기술 지원을 받을 수 있는지, 경쟁력 향상에 기 여할 수 있는 지 등을 판단 기준으로 삼고 있다. 그 결과, 굳이 외산을 고집하지도 않을 뿐더러 보다 비용 효과적인 제품들의 선택에 눈을 돌리고 있다. 결국 기업들은 갈수록 방대해지는 데이터의 효용성을 높이고, 트랜 잭션 처리 속도의 향상이라는 해결 방안을 제시하고, 실제 상용 DBMS 대비 70∼80% 비용에 10배 이상의 성능을 발휘하는 MM DBMS를 주목하는 것은 지극히 당연한 일이라고 할 수 있다. MM DBMS의 개념 MM DBMS와 DR DBMS의 기능적, 구조적 차이점을 살펴보기 전에 디스크 저장 장치와 메모리 간의 다른 특성에 대해 먼저 살펴보 기로 한다. ·메모리에 대한 접근 속도는 디스크 저장 장치와 비교되지 않을 만큼 빠르다. ·메모리는 휘발성 저장 장치이다. 그러나 비용을 추가하면 메모리를 비휘발 성 저장 장치로 구성하는 것도 가능하다. ·디스크 데이터의 배치상태는 메모리의 데이터 배치상태보다 접근 속도에 결 정적인 영향을 줄 수 있다. 때문에 디스크에 대한 순차적(sequential) 접근 속도가 랜덤 액세스(Random Access)보다 훨씬 빠르다. 메모리 데이터에 대한 순차적 접근은 중요하지 않다. ·보통 프로세서는 메모리를 직접 접근하지만 디스크는 그렇지 않다. 이 때문 에 메모리 상의 데이터는 디스크 상의 데이터에 비해서 소프트웨어 에러의 영향을 받기가 쉽다. 이와 같은 차이점은 동시성 제어, 데이터 저장구조, 인덱스 구조 등 에 이르기까지 메모리의 빠른 접근 속도를 효율적으로 이용하도록 MM DBMS의 설계와 구현 시에 고려됐다. MM DBMS가‘데이터의 고속 처리’라는 목표를 위해 개발된 제품 이긴 하지만, 동시에 기본적인 DBMS의 요건인 데이터의 안정성을 보장할 수 있어야 한다. 그러나 메모리는 그 특성상 전원공급이 차단 되면 저장 내용이 소실되는 휘발성의 저장 장치이므로, 정전이나 운 영체제의 다운 등과 같이 예기치 않은 상황에서는 데이터의 안정성을 보장할 수 없다. 이에 대한 해결책으로 MM DBMS는 DR DBMS와 마찬가지로 메 모리 상의 데이터 변경사항을 디스크에도 동시에 기록한다. 일반적으 로 메모리가 디스크에 비해 수천 배 빠르지만, MM DBMS가 DR DBMS에 비해 수천 배 빠르지 않은 이유는 데이터 안정성 보장을 위 해 비휘발성 저장 장치인 디스크 장치를 이용하는 디스크 I/O를 동반 하기 때문이다. MM DBMS는 구동하면서 데이터와 인덱스를 포함한 디스크 상의 모든 데이터베이스 전체를 메모리로 로딩(loading)하는 단계를 거친 후, 모든 레코드 접근이 메모리 상에서 이뤄진다. 구동 이후부터는 디 스크는 메모리 상의 변경 트랜잭션에 대한 백업 데이터를 유지하는 용도로 사용된다. 휘발성의 저장 공간인 메모리에 저장되는 데이터를 영구적인 기록 장치인 디스크에도 동시에 기록함으로써 일반인이 우려하는 것처럼 정전이나 MM DBMS의 다운 혹은 시스템 다운으로 인해 데이터베이 156 June2006 LECTURE │ 하이브리드 DBMS 1 그림 1|MM DBMS의 활용추이 1999 2000 2001 2002 2003 년 성장단계 성숙 성장 초기 진입 하드웨어 성장속도에 따라 가속도가 붙을 수 있음 하드웨어: 64비트 OS 메모리 : 제한없음 하드웨어 32비트 OS 메모리 : 2GB 154-159_06_강좌-DBMS 2006.5.27 7:45 PM 페이지156 MAC52 2400DPI 175LPI 스 데이터가 소실되지 않는 것이다. 그러나 데이터의 안정성 보장을 위한 디스크 I/O 작업은 MM DBMS에게 데이터 처리 성능 저하라는 불가피한 손실(trade-off)을 요구하기 때문에 MM DBMS에는 디스크 I/O에 의한 성능저하를 감 소시키기 위한 다양한 기법이 도입됐다. 첫째, 디스크 I/O 횟수를 가능한 한 최소화했다. MM DBMS는 DR DBMS와는 달리 버퍼 캐시가 별도로 존재하지 않기 때문에 페이 지 교체가 없고, 체크포인트 시점에서만 메모리와 데이터베이스 간의 동기화가 이뤄지며, 이로 인해 DR DBMS보다 로그 버퍼가 강제로 디스크에 플러시(flush)되는 상황을 줄일 수 있어 I/O 횟수를 줄일 수 최소화한다. 둘째, 디스크에 로깅(logging)되는 정보의 양을 최대한 줄였다. 로 깅되는 정보를 로그 레코드라고 하는데, 이 로그 레코드에는 변경된 데이터의 내용뿐만 아니라 장애 발생시점 이전으로 회복(Recovery) 하는 데 필요한 다른 정보들을 포함하기 때문에 변경된 데이터의 양 보다 크다. 따라서 로그 레코드를 최대한 줄여서 디스크 I/O 양을 줄 이는 것이 성능 저하를 최소화하는데 매우 중요하다. MM DBMS에 서는 인덱스 구성을 DBMS 구동 시에 다시 생성하는 구조를 가져감 으로써 인덱스 변경에 따른 트랜잭션 로그를 남기지 않는 방식을 채 택하고 있다. 이로써 생성되어야 할 많은 양의 트랜잭션 로그를 획기 적으로 줄일 수 있다. 그리고 트랜잭션 중간에 발생하는 실행 취소 레 코드(Undo Record) 역시 메모리 페이지에 만들기 때문에 트랜잭션 회복 데이터의 생성을 위한 디스크 연산을 줄일 수 있다. DR DBMS와 MM DBMS, 주 데이터 위치가 달라 장애시점 이전으로의 회복을 위해 MM DBMS는 주기적인 체크포 인트를 통해 변경된 메모리 데이터를 디스크로 동기화하는 방법과 마 지막 체크포인트 이후에 생긴 트랜잭션 로그파일을 통한 복구 방법을 사용한다. 이는 일반적으로 사용되는 DBMS의 회복기법이며, DR DBMS에서도 유사한 방식을 사용한다. DR DBMS와 대비되는 MM DBMS의 가장 큰 특징이자 차이점은 운영 데이터의 존재 위치가 다르다는 점이다. 그러나 DR DBMS에서 도 디스크 데이터는 빠른 액세스를 위해 메모리를 사용하는 버퍼 영 역으로 캐시될 수 있고 MM DBMS는 메모리에 있는 데이터를 디스 크에 백업할 수 있다. 따라서 DR DBMS와 MM DBMS 모두 특정 데이터가 디스크와 메모리에 동시에 존재할 수 있다. 그러나 MM DBMS에서는 주(primary) 데이터의 상주 위치가 메모리이고 디스 크에는 단순히 백업 데이터가 저장되지만, DR DBMS는 디스크 상에 주 데이터가 존재한다는 점이 가장 큰 차이점이다. 그렇다면 충분히 큰 버퍼 캐시를 확보한 DR DBMS는 MM DBMS와 어떤 차이점이 있는 것일까라는 의문을 가져볼 수도 있다. DR DBMS가 모든 디스크 데이터 전체가 버퍼 캐시에 상주할 수 있을 정도로 충분히 확보된 경우, 캐시가 작을 때에 비해 좋은 성능을 내는 것은 분명하나 메모리를 효율적으로 이용하지는 못한다. 애플리 케이션이 특정 튜플(tuple)에 접근할 때마다 먼저 그 디스크의 어드 레스(address)가 계산되고, 그런 후 버퍼 매니저는 해당 데이터 블록 이 메모리에 있는지 조사할 것이다. 그러나 레코드가 메모리에 상주 한다면 이런 과정이 필요없이 그 레코드의 주소를 메모리 어드레스로 바로 참조할 수 있다. 불필요한 연산과정을 생략하고 접근 알고리즘 을 단순할 수 있기 때문에 DR DBMS와 탐색 속도에서 차이가 난다. MM DBMS의 구조 MM DBMS는 실시간 트랜잭션 처리를 주된 목표로 개발된 제품 이지만 DBMS의 목적인 데이터 관리와 데이터베이스 애플리케이션 개발을 지원해야 하므로, DR DBMS와 유사한 구조를 지니고 있다. 보편적으로 사용되는 관계형 데이터 모델(Relational DBMS Model) 을 지원하고 표준 SQL 구문을 대부분 지원하며, 데이터베이스 애플 리케이션 개발을 위한 다양한 도구를 제공한다는 점에서 기존 DR ontheNET 157 그림 2|MM DBMS와 DR DBMS의 데이터 처리구조 RDBMS Relational Database Management System. 관계형 데이터베이스 관리 시스템. 데이터베이스 관 리 시스템의 요소를 재결합해 새로운 관계를 갖는 시스템으로 만들 수 있어 다양한 이용 가능성 을 제공한다. 열과 행으로 돼 있는 2차원 표로 데이터를 보여준다. 현재 보급돼 있는 유닉스나 PC를 플랫폼으로 한 DBMS의 대부분은 바로 RDBMS. 여러 명의 이용자가 데이터베이스를 동 시에 호출, 이용할 수 있고 단말기를 통해 데이터베이스를 기록하거나 판독하는 것도 가능하다. 캐시 cache.디스크와 메모리처럼 처리 속도의 차이에 의해 발생하는 작업의 대기 시간을 줄이기 위 해 만들어 놓은 고속 저장 장치. 캐시는 주로 자주 사용되는 데이터 블록을 저장해 CPU의 액세 스 시간을 최소화하는데 사용한다. 일반적으로 하드디스크보다 메모리의 액세스 속도가 빠르 기 때문에 시스템 성능을 향상시키는 효과를 가져온다. 용 ■ 어 ■ 설 ■ 명 MM DBMS CPU 데이터베이스 버퍼 데이터베이스 백업 백업 데이터베이스 물리적 메모리 물리적 메모리 테이블, 인덱스 테이블, 인덱스 CPU 디스크 기반의 DBMS 154-159_06_강좌-DBMS 2006.5.27 7:45 PM 페이지157 MAC52 2400DPI 175LPI DBMS와 큰 차이가 없다. MM DBMS의 내부구조는 각 개발업체마다 약간의 차이가 있으므 로 여기에서는 알티베이스 제품을 대상으로 기술한다. 알티베이스 구 조는 데이터베이스 인터페이스, 통신계층, 질의처리계층, 자료저장관 리계층, 유틸리티 등으로 분류할 수 있다. 데이터베이스 애플리케이션 개발과 밀접한 관련이 있 는 인터페이스는 클라이언트/서버용 인터페이스인 ODBC, JDBC, ESQL (Embedded SQL)를 지원하므 로 DR DBMS 개발방식과 유사한 방식으로 데이터베이 스 애플리케이션 개발이 가능하다. 통신 계층(Communication Layer)은 데이터베이스 클라이언트 프로그램들과 데이터베이스 서버 간의 통신 과 연결정보를 관리한다. 질의처리 계층(Query Processing Layer)은 실행할 SQL 구문을 파싱 (Parsing)하고 옵티마이저가 질의를 최적화하고 실행하 는 계층이다. 자료저장관리계층(Storage Management Layer)은 메모리에 상주하는 실제 데이터를 저장하고 관리하는 계 층이다. 유틸리티로는 데이터 입출력 툴(ILOADER), 대화형 질의도구(ISQL), 프리컴파일러, GUI 툴 (Admin Center), 이중화 데이터 관리 툴(AUDIT) 등 이있다. MM DBMS vs DR DBMS MM DBMS와 DRDBMS의 가장 근본적인 차이는 저장 장소의 차이이다. DR DBMS의 저장 장소는 기본 적으로 디스크인 반면, MM DBMS의 데이터 저장 장소 는 메모리다. 데이터를 관리하는 기능에 있어서는 거의 차이가 없다. 그러나 분명히 이들을 서로 구분되는 몇 가지 특징들 이 있다. (표 1)는 MM DBMS와 DR DBMS를 비교 분 석한 자료이다. (표 1)에 보는 바와 같이 MM DBMS는 DR DBMS 와 마찬가지로 데이터 관리와 접근이라는 DBMS의 기 본적인 요구 기능을 지원해야 하므로, 많은 부분에서 유 사한 특징을 갖고 있다. 특히 고가용성을 보장하기 위해 MM DBMS가 이중화 기능을 지원하고 있는 점은 주목 할 만하다. DR DBMS는 디스크 공유가 가능하기 때문에 데이터 베이스 자체를 공유하는 것이 가능하므로 클러스터링 기법을 사용하는 반면, MM DBMS는 일반적으로 메인 메모리를 서버 간에 공유하는 것이 불가능하기 때문에 네트워크를 통해 양 서버의 데이터베이스를 실시간으로 복제해 사용 하는 이중화 기법을 사용한다. 이런 이중화 기능은 MM DBMS를 통 신이나 금융 등 고가용성을 요구하는 산업에도 적용 가능하게 한 기 술적인 성과이다. 이에 대해서는 다음 회에서 보다 자세히 살펴보기 158 June2006 LECTURE │ 하이브리드 DBMS 1 표 1|MM DBMS와 DR DBMS의 비교 구분 MM DBMS(알티베이스) DR DBMS DBMS 프로세스 구조 멀티 쓰레드 구조 멀티 프로세스 구조, 멀티 쓰레드 구조 데이터 모델 관계형 모델 구조 관계형 모델 구조 아키텍처 클라이언트/서버, 응용 내장 클라이언트/서버 이중화 네트워크를 통한 데이터 이중화 디스크 공유 턴스 데이터 버전관리 다중 버전 레벨 데이터 처리 다중 버전 레벨 데이터 처리 Locking Mode 레코드 레벨 락 레코드 레벨 락 DB Recovery 체크포인트 이용 체크포인트 이용 DBMS 인터페이스 ODBC, JDBC, CLI, Embedded SQL, ODBC, JDBC, CLI, Embedded SQL, PHP, Perl, XA, SNMP, GIS, LDAP, PHP, Perl, XA, SNMP, GIS, LDAP, Stored Procedure 등 Stored Procedure, 4GL, XML 등 이외에도 다수의 API를 제공함 데이터 액세스 SQL92 표준 SQL 표준뿐만 아니라 확장된 SQL 인덱스 변형된 B Tree, T-tree B* Tree 저장데이터 용량 시스템에서 제공하는 메모리공간 시스템에서 제공하는 디스크 용량 DB 위치 메모리와 디스크 디스크 (체크포인트를 통해 동기화 됨) 트랜잭션로그 디스크 디스크 온라인 백업 지원 지원 유틸리티 관리자 도구, 모니터링 도구, 대화형 질의 MM DBMS가 지원하는 유틸리티 도구, 데이터 입출력 유틸리티, 외에도 많은 다양한 도구가 있고 SQL 튜닝도구, 국내 DB 써드 파티업체 써드 파티 업체를 통해서도 와의 협력으로 모니터링과 튜닝 툴들이 다양한 유틸리티들이 제공됨. 출시예정 그림 3|알티베이스의 내부 구조 ODBC 세션 관리 리플리 케이션 관리 유틸 리티 도서관 관리 SQL 파서 옵티 마이져 SQL 실행기 저장 프로시저 확장 모듈 관 리 안전(Lock) 관리 썬 솔라리스 HP-UX IBM ALX 컴팩 Tru64 리눅스 아이 태니움 윈도우 NT/ 2000 RTOSs (VxWords, QNX) 복구 관리 트랜잭션 관리 메모리 관리 체크포인트 관리 로그 관리 인덱스 관리 JDBC 커뮤니케이션 계층 플랫폼 계층 쿼리 프로세싱(질의처리) 스토리지 관리(자료저장관리) 계층 운영계 시스템 ESQL SQL CLI 154-159_06_강좌-DBMS 2006.5.27 7:45 PM 페이지158 MAC52 2400DPI 175LPI 로하자. (그림 4 )는 MM DBMS와 DR DBMS의 처리성 능을 수치화해 그래프화한 것이다. 데이터 변경 연 산(Insert, Update, Delete문)은 약 50배 정도의 성능 차이가 나며, 데이터 조회 작업은 DR DBMS 역시 버퍼 캐시에 존재하는 데이터를 대상으로 했 기 때문에 약 3∼4배 정도의 차이가 발생한다. MM DBMS의 발전추이 MM DBMS는 짧은 역사에도 불구하고 소형 휴 대기기인 PDA부터 대형 플랫폼까지 다양한 종류 의 플랫폼에서 작동하며, 데이터베이스 크기와 적 용형태에 따라 다음 세 가지 유형의 제품군으로 분 류되며 발전했다. - 내장형(Embedded) MM DBMS 메모리 크기가 제한적인 특수목적의 하드웨어나 업무에 이용되며, 게이트웨이나 통신 서비스 장비, HLR 등에 플랫폼 내장형 또는 소프트웨어 내장형 등의 형태로 활용 된다. 일부 제품은 고성능 경량화를 위해서 범용 메모리 DBMS에서 사 용되는 클라이언트/서버 아키텍처가 아닌 데이터베이스 서버가 애플 리케이션에 내장되는 형태인 애플리케이션 내장형 구조를 갖기도 한 다. 범용 MM DBMS의 많은 기능을 제거한 대신 고성능 경량화를 추 구하며, 디스크가 없는 장비에서 구동되는 경우 회복을 위한 로깅조 차 하지 않은 형태로 운영되기도 한다. - 범용 MM DBMS DR DBMS로 요구 성능을 만족시킬 수 없을 경우, 대체용 DB로 활용되거나 MM DBMS와 DR DBMS를 병행 사용하는 형태로 사용 된다. 때문에 DR DBMS을 대체할 수 있도록 많은 기본기능을 지원 하고 산업표준 규약을 준수해 DR DBMS와의 호환성을 유지한다. 처 리 업무의 특성에 따라서 DB의 크기는 수백 메가바이트에서 수십 기 가바이트까지 다양하다. 한가지 제품으로 소용량 데이터베이스와 대 용량 데이터베이스 기능 모두를 지원한다. - 하이브리드형(Hybrid) MM DBMS 지난 해부터 시장에 출시되기 시작한 신개념의 MM DBMS로, 기 존 MM DBMS가 갖는 시스템이 지원하는 메모리 크기를 초과할 수 없는 MM DBMS의 데이터베이스 용량의 한계를 극복한 제품이다. 데이터를 메모리뿐만 아니라 디스크에도 선택적으로 저장할 수 있도 록 DR DBMS의 기능도 동시에 제공한다. 접근 빈도가 높은 데이터 (Hot data)는 메모리에, 빈도가 낮은 데이터(Cold data)는 디스크에 저장하는 것이 가능하므로 시스템 메모리보다 큰 데이터베이스 용량 을 사용할 수 있다. 고성능 대용량이라는 두 가지 기능을 동시에 요구 하는 업무영역에 데이터베이스 용량의 한계로 인해서 MM DBMS 만 으로는 대체가 불가능해 MM DBMS와 DR DBMS를 병행 사용해야 할 때 발생할 수 있는 여러 가지 단점을 해결한 제품이다. 이상으로 MM DBMS의 등장배경과 개념 그리고 구조와 발전 과 정에 걸쳐 대략적으로 살펴 봤다. 다음 호에서는 MM DBMS의 여러 특징들이 산업현장에서 어떻게 이용되고 있는지 MM DBMS의 활용 사례를 중심으로 알아보기로 한다. ontheNET 159 그림 4|MM DBMS와 DR DBMS의 처리성능 ODBC Open DataBase Connectivity. 다양한 종류의 데이터베이스를 액세스하기 위해 마이트로 소프트 가 정의한 표준 개방형 데이터베이스 인터페이스 규약. ODBC API를 이용하면 MS 액세스, dBase, DB2, 액세스, 텍스트 등 여러 가지 종류의 데이터베이스를 같은 방법으로 액세스할 수 있다. 이를 위해선 ODBC 소프트웨어 외에 액세스할 각 데이터베이스마다 별도의 모듈이나 드 라이버가 필요하다. JDBC Java DataBase Connectivity. 자바 프로그램에서 데이터베이스에 접속하기 위한 표준 API. 썬 마 이크로시스템이 개발해 JDK 1.1 이후부터 JDK에 포함됐다. JDBC 드라이버는 DBMS 업체가 만들어 배포하며, 프로그래머에게 DBMS에 상관없이 똑같은 인터페이스를 지원한다. 용 ■ 어 ■ 설 ■ 명 환경 ·Sun E450 ·CPU : 400Mhz*4 1 2 4 8 16 32 64 클라이언트 TPS 알티베이스 IPC DR DBMS SELECT INSERT UPDATE DEDETE 20000 15000 10000 5000 350 300 250 200 150 100 50 154-159_06_강좌-DBMS 2006.5.27 7:45 PM 페이지159 MAC52 2400DPI 175LPI
- [기사] MMDBMS의 등장 배경
...
Manual
-
- [Altibase 7.1] JDBC User's Manual
ㅣ 2017-07-06
- Altibase® Application Development JDBC User’s Manual Release 7.1 (August 28, 2018) ----------------------------------------------------------- Altibase Application Development JDBC User’s Manual Release 7.1 Copyright ⓒ 2001~2018 Altibas
-
미리보기
Altibase® Application Development JDBC User’s Manual Release 7.1 (August 28, 2018) ----------------------------------------------------------- Altibase Application Development JDBC User’s Manual Release 7.1 Copyright ⓒ 2001~2018 Altibase Corp. All Rights Reserved. 본 문서의 저작권은 ㈜알티베이스에 있습니다. 이 문서에 대하여 당사의 동의 없이 무단으로 복제 또는 전용할 수 없습니다. ㈜알티베이스 08378 서울시 구로구 디지털로 306 대륭포스트타워Ⅱ 10층 전화: 02-2082-1114 팩스: 02-2082-1099 고객서비스포털: http://support.altibase.com homepage: http://www.altibase.com ----------------------------------------------------------- 목차 3 목 차 서문 ......................................................................................................................... 5 이 매뉴얼에 대하여 ......................................................................................................................... 6 1. JDBC 시작하기 ............................................................................................. 11 JDBC 드라이버 설치...................................................................................................................... 12 데이터베이스에 연결하기 ........................................................................................................... 14 연결 정보 ............................................................................................................................................ 16 Statement와 ResultSet 다루기 ................................................................................................. 30 JDBC Connection Failover ........................................................................................................... 32 2. 기본 기능 ...................................................................................................... 33 IPv6 접속 ............................................................................................................................................ 34 Statement, PreparedStatement 및 CallableStatement ................................................. 36 내셔널 캐릭터 셋 사용 ................................................................................................................ 38 3. 고급 기능 ...................................................................................................... 39 자동 생성 키 ..................................................................................................................................... 40 타임아웃 .............................................................................................................................................. 42 DataSource ......................................................................................................................................... 44 Connection Pool .............................................................................................................................. 46 Multiple ResultSet .......................................................................................................................... 50 JDBC와 Failover ............................................................................................................................... 51 JDBC Escapes .................................................................................................................................... 56 ResultSet 사용하기 ........................................................................................................................ 57 Atomic Batch ..................................................................................................................................... 64 Date, Time, Timestamp ................................................................................................................ 66 GEOMETRY ......................................................................................................................................... 68 LOB ........................................................................................................................................................ 69 Autocommit 제어 ........................................................................................................................... 84 BIT, VARBIT ........................................................................................................................................ 85 4 JDBC User's Manual JDBC 로깅 .......................................................................................................................................... 86 Hibernate ............................................................................................................................................ 90 4. Tips ation .......................................................................... 91 성능을 위한 팁 ................................................................................................................................ 92 5. 에러 메시지 .................................................................................................. 93 SQL States .......................................................................................................................................... 94 A. 부록: 데이터 타입 맵핑 ........................................................................... 99 데이터 타입 맵핑 ......................................................................................................................... 100 Java 데이터형을 데이터베이스 데이터형으로 변환하기 ........................................... 102 데이터베이스 데이터형을 Java 데이터형으로 변환하기 ........................................... 103 찾아보기 ............................................................................................................. 105 서문 5 서문 6 JDBC User's Manual 이 매뉴얼에 대하여 이 매뉴얼은 Altibase가 제공하는 JDBC 드라이버의 사용법에 대해 설명한다. Altibase의 JDBC 드라이버는 JDBC 사양을 대부분 준수하나, 경우에 따라서 사양에서 벗어난 방식으로 동작한다. JDBC를 이용해서 애플리케이션을 작성하기 전에, 본 매뉴얼을 참고하여 JDBC 사양과 다른 부분에 대한 지식을 습득할 것을 권고한다. 대상 사용자 이 매뉴얼은 다음과 같은 Altibase 사용자를 대상으로 작성되었다. 데이터베이스 관리자 성능 관리자 데이터베이스 사용자 응용 프로그램 개발자 기술지원부 다음과 같은 배경 지식을 가지고 이 매뉴얼을 읽는 것이 좋다. 자바 프로그래밍 언어 SQL Stored Procedure Altibase에 대한 이해 소프트웨어 환경 이 매뉴얼은 데이터베이스 서버로 Altibase 버전 7.1을 사용한다는 가정 하에 작성되었다. 이 매뉴얼의 구성 이 매뉴얼은 다음과 같이 구성되어 있다. 제 1장 시작하기 이 장에서는 Altibase의 JDBC 드라이버를 이용하는 기본적인 방법을 기술한다. 제 2 장 기본 기능 서문 7 이 장에서는 Altibase의 JDBC 드라이버를 사용해서 데이터베이스의 객체를 다루는 기본적인 방법을 설명한다. 제 3 장 고급 기능 이 장에서는 Altibase의 JDBC 드라이버가 제공하는 보다 향상된 기능과 그 사용법을 설명한다. 제 4 장 Tips ation 이 장은 Altibase의 JDBC 드라이버를 효율적으로 사용하기 위한 방법을 제시한다. 제 5장 에러 메시지 이 장은 Altibase의 JDBC 드라이버를 사용하면서 발생할 수 있는 SQL State를 기술한다. 부록 A. 데이터 타입 맵핑 Altibase의 데이터 타입과 JDBC 표준 데이터 타입, Java 데이터 타입간에 호환 여부를 기술한다. 문서화 규칙 이 절에서는 이 매뉴얼에서 사용하는 규칙에 대해 설명한다. 이 규칙을 이해하면 이 매뉴얼과 설명서 세트의 다른 매뉴얼에서 정보를 쉽게 찾을 수 있다. 여기서 설명하는 규칙은 다음과 같다. 구문 다이어그램 샘플 코드 규칙 구문 다이어그램 이 매뉴얼에서는 다음 구성 요소로 구축된 다이어그램을 사용하여, 명령문의 구문을 설명한다. 구성 요소 의미 예약어 명령문이 시작한다. 완전한 명령문이 아닌 구문 요소는 화살표로 시작한다. 명령문이 다음 라인에 계속된다. 완전한 명령문이 아닌 구문 요소는 이 기호로 종료한다. 명령문이 이전 라인으로부터 계속된다. 완전한 명령문이 아닌 구문 요소는 이 기호로 시작한다. ; 명령문이 종료한다. 8 JDBC User's Manual SELECT 필수 항목 NOT 선택적 항목 ADD DROP 선택사항이 있는 필수 항목. 한 항목만 제공해야 한다. ASC DESC 선택사항이 있는 선택적 항목 , ASC DESC 선택적 항목. 여러 항목이 허용된다. 각 반복 앞부분에 콤마가 와야 한다. 샘플 코드 규칙 코드 예제는 SQL, Stored Procedure, iSQL 또는 다른 명령 라인 구문들을 예를 들어 설명한다. 아래 테이블은 코드 예제에서 사용된 인쇄 규칙에 대해 설명한다. 규칙 의미 예제 [ ] 선택 항목을 표시 VARCHAR [(size)] [[FIXED |] VARIABLE] { } 필수 항목 표시. 반드시 하나 이상을 선택해야 되는 표시 { ENABLE | DISABLE | COMPILE } | 선택 또는 필수 항목 표시의 인자 구분 표시 { ENABLE | DISABLE | COMPILE } [ ENABLE | DISABLE | COMPILE ] . . . 그 이전 인자의 반복 표시 예제 코드들의 생략되는 것을 표시 SQL> SELECT ename FROM employee; ENAME ----------------------- SWNO HJNO 서문 9 HSCHOI . . . 20 rows selected. 그 밖에 기호 위에서 보여진 기호 이 외에 기호들 EXEC :p1 := 1; acc NUMBER(11,2); 기울임 꼴 구문 요소에서 사용자가 지정해야 하는 변수, 특수한 값을 제공해야만 하는 위치 지정자 SELECT * FROM table_name; CONNECT userID/password; 소문자 사용자가 제공하는 프로그램의 요소들, 예를 들어 테이블 이름, 칼럼 이름, 파일 이름 등 SELECT ename FROM employee; 대문자 시스템에서 제공하는 요소들 또는 구문에 나타나는 키워드 DESC SYSTEM_.SYS_INDICES_; 관련 자료 자세한 정보를 위하여 다음 문서 목록을 참조하기 바란다. Administrator’s Manual Replication Manual Spatial SQL Reference 온라인 매뉴얼 Altibase 고객서비스포털(http://support.altibase.com)에서 국문 및 영문 매뉴얼(PDF, HTML)을 받을 수 있다. Altibase는 여러분의 의견을 환영합니다. 이 매뉴얼에 대한 여러분의 의견을 보내주시기 바랍니다. 사용자의 의견은 다음 버전의 매뉴얼을 작성하는데 많은 도움이 됩니다. 보내실 때에는 아래 내용과 함께 고객서비스포털(http://support.altibase.com/kr/)로 보내주시기 바랍니다. 10 JDBC User's Manual 사용 중인 매뉴얼의 이름과 버전 매뉴얼에 대한 의견 사용자의 성함, 주소, 전화번호 이 외에도 Altibase 기술지원 설명서의 오류와 누락된 부분 및 기타 기술적인 문제들에 대해서 이 주소로 보내주시면 정성껏 처리하겠습니다. 또한, 기술적인 부분과 관련하여 즉각적인 도움이 필요한 경우에도 고객서비스포털을 통해 서비스를 요청하시기 바랍니다. 여러분의 의견에 항상 감사드립니다. JDBC 시작하기 11 1. JDBC 시작하기 이 장에서는 Altibase의 JDBC 드라이버를 이용하는 기본적인 방법을 기술한다. 12 JDBC User's Manual JDBC 드라이버 설치 Altibase 홈페이지 (www.altibase.com)에서 다운로드 받은 Altibase 패키지를 다운로드 하여 설치한다. Altibase JDBC 드라이버는 패키지를 설치한 후, $ALTIBASE_HOME/lib 디렉토리에서 찾을 수 있다. 버전 호환성 Altibase 7.1 JDBC 드라이버는 Type 4 pure Java JDBC 드라이버로써, JDBC 3.0 스펙을 준수한다. 또한, JDK 1.5 이상에서 정상적으로 동작한다. JDBC 드라이버 버전 확인 설치된 JDBC 드라이버의 버전과 드라이버가 컴파일된 JDK 버전을 아래와 같이 확인할 수 있다. $ java -jar $ALTIBASE_HOME/lib/Altibase.jar JDBC Driver Info : Altibase 7.1.0.0.0 with CMP 7.1.3 for JDBC 3.0 compiled with JDK 5 CLASSPATH 설정 Altibase JDBC를 사용하려면 Altibase JDBC 드라이버를 CLASSPATH 환경변수에 추가해야 한다. Altibase는 로깅 기능을 지원하지 않는 Altibase.jar 파일과 지원하는 Altibase_t.jar 파일을 함께 제공한다. ex) 유닉스 환경에서 bash 쉘을 사용하는 경우 $ export CLASSPATH=$ALTIBASE_HOME/lib/Altibase.jar:.:$CLAS SPATH LD_LIBRARY_PATH 설정 비동기적 prefetch의 auto-tuning 기능을 사용할 경우에는 JNI 모듈이 필요하며 libaltijext.so 파일이 위치한 디렉토리를 JDBC 시작하기 13 LD_LIBRARY_PATH 환경변수에 추가하여야 한다. JNI 모듈을 로딩하는데 실패하더라도 auto-tuning 이외의 기능은 정상 동작한다. ex) 유닉스 환경에서 bash 쉘을 사용하는 경우 $ export LD_LIBRARY_PATH=$ALTIBASE_HOME/lib:.:$LD_LIBRARY_ PATH 14 JDBC User's Manual 데이터베이스에 연결하기 이 절에서는 JDBC로 Altibase 서버에 연결하는 기본적인 방법을 프로그램 코드로 설명한다. 드라이버 로딩 Altibase JDBC 드라이버의 Driver 클래스를 로딩하고, 드라이버를 찾아오는 방법이다. 1. DriverManager에 Altibase JDBC 드라이버를 등록한다. Class.forName(“Altibase.jdbc.driver.AltibaseDriver”) ; 2. 연결 URL을 사용해서 DriverManger에서 드라이버를 획득할 수 있다. String sURL = "jdbc:Altibase://localhost:20300/mydb"; Driver sDriver = DriverManager.getDriver( sURL ); 연결 정보 설정 Properties 객체를 사용해서 다수의 연결 정보를 드라이버에 전달할 수 있다. 다음은 Properties 객체에 연결 속성을 셋팅하는 코드 예제이다. Properties sProps = new Properties(); sProps.put("user", "SYS"); sProps.put("password", "MANAGER"); 데이터베이스에 접속 연결 URL과 연결 정보를 사용해서 데이터베이스에 접속할 수 있다. 다음은 데이터베이스에 연결하고 Connection 객체를 획득하는 코드 예제이다. Connection sCon = sDriver.connect(sURL, sProps); 위의 connect 메소드의 인자로 사용되는 연결 URL의 형식은 아래와 같다. jdbc:Altibase://server_ip:server_port/dbname JDBC 시작하기 15 예제 import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.util.Properties; public class ConnectionExample { public static void main(String[] args) throws Exception { String sURL = "jdbc:Altibase://localhost:20300/mydb"; Properties sProps = new Properties(); sProps.put("user", "SYS"); sProps.put("password", "MANAGER"); Class.forName("Altibase.jdbc.driver.AltibaseDriver"); Driver sDriver = DriverManager.getDriver(sURL); Connection sCon = sDriver.connect(sURL, sProps); } } 컴파일과 실행 아래와 같이 JDBC 응용프로그램을 컴파일하고 실행할 수 있다. $ javac ConnectionExample.java $ java ConnectionExample 16 JDBC User's Manual 연결 정보 이 절에서는 Altibase에 접속할 때 사용 가능한 연결 속성들의 정보를 기술하고, 연결 속성을 설정하는 방법에 대해 설명한다. 연결 속성 설정하기 데이터베이스 접속에 필요한 연결 속성을 Properties 객체에 설정하거나 연결 URL에 명시할 수 있다. 연결 URL 사용하기 연결 URL 끝에 "?"를 붙이고 그 뒤에 "key=value" 형식으로 프로퍼티 값을 지정할 수 있다. 여러 개의 프로퍼티를 입력할 때는 " 면 된다. 다음은 연결 URL의 예제이다. "jdbc:Altibase://localhost:20300/mydb?fetch_enough=0 DB_TZ" Properties 객체 사용하기 Properties 객체를 생성하고 키와 값을 입력한 다음, 연결 정보로 이용하면 된다. 아래는 Properties 객체를 사용하는 예제이다. Properties sProps = new Properties(); sProps.put("fetch_enough", "30"); sProps.put("time_zone", "DB_TZ"); ... Connection sCon = DriverManager.getConnection( sURL, sProps ); 연결 속성 정보 Altibase에 접속할 때 사용 가능한 연결 속성에 대해 기술한다. 각 속성에 대한 기술에는 다음의 항목들이 포함된다. 기본값: 명시하지 않을 경우 기본적으로 사용되는 값 값의 범위: 지정 가능한 값 필수 여부: 반드시 지정해야 하는지 여부 JDBC 시작하기 17 설정 범위: 설정한 속성이 시스템 전체에 영향을 미치는지 또는 해당 세션에만 영향을 미치는지 여부 설명: 속성에 대한 설명 alternateservers 기본값 값의 범위 [ host_name:port_number[/dbname] [, host_name:port_number[/dbname] ]* 필수 여부 No 설정 범위 설명 Connection Failover 발생 시 접속할 수 있는 서버들의 리스트이다. 사용법은 3장의 "JDBC와 Failover" 절을 참고한다. app_info 기본값 값의 범위 임의의 문자열 필수 여부 No 설정 범위 세션 설명 V$SESSION의 CLIENT_APP_INFO 칼럼에 저장될 문자열을 지정한다. auto_commit 기본값 true 값의 범위 [true | false] 필수 여부 No 설정 범위 세션 설명 구문의 수행이 완료될 때 트랜잭션이 자동으로 커밋될 지 여부를 지정한다. defer_prepares 기본값 off 값의 범위 [on | off] 필수 여부 No 18 JDBC User's Manual 설정 범위 세션 설명 PrepareStatement가 호출될 때 서버와의 통신을 보류할지 여부(ON, OFF)를 지정할 수 있다. 이 속성이 ON이면, PrepareStatement가 호출이 되더라도 Execute 함수가 호출될 때까지 prepare 요청이 서버로 전송되지 않는다. 그러나 이 속성이 OFF이면, PrepareStatement가 호출될 때 prepare 요청이 즉시 서버로 전송된다. 단 PrepareStatement () 뒤에 다음의 메소드들이 호출되면, prepare 요청이 즉시 서버로 전송된다. getMetData getParameterMetaData setObject(int, Object, int) 또한 DBCP의 statement pool이 활성화되어 있을 경우 충돌이 발생할 수 있기 때문에 deferred 옵션이 켜져 있을 경우에는 statement pool 옵션을 꺼야 한다. ciphersuite_list 기본값 JRE가 지원하는 모든 cipher suite list를 참조한다. 값의 범위 임의의 문자열 필수 여부 No 설정 범위 N/A 설명 서버에 SSL 통신을 위해 사용할 암호 알고리즘 목록이다. clientside_auto_commit 기본값 off 값의 범위 [on | off] 필수 여부 No 설정 범위 세션 설명 Autocommit의 동작을 Altibase 서버가 제어할 것인지, JDBC 드라이버가 제어할 것인지를 설정한다. auto_commit 속성이 true이거나 auto_commit 속성이 지정되지 않은 경우에만 이 속성의 설정 값이 적용된다. JDBC 시작하기 19 on: JDBC 드라이버가 자동커밋 제어 off: Altibase 서버가 자동커밋 제어 자세한 설명은 3장의 "Autocommit 제어" 절을 참고한다. connectionretrycount 기본값 0 값의 범위 Unsigned Integer 범위내의 숫자값 [1 - 231] 필수 여부 No 설정 범위 설명 Connection Failover 발생 시, 타 서버로 재접속을 시도하는 횟수를 지정한다. 이 값이 1일 경우 타서버로 재시도 횟수는 한 번이므로, 총 두 번의 접속 시도를 한다. 사용법은 3장의 "JDBC와 Failover" 절을 참고한다. connectionretrydelay 기본값 0 값의 범위 Unsigned Integer 범위내의 숫자값 [1 - 231] 필수 여부 No 설정 범위 설명 Connection Failover 발생 시, ConnectionRetryCount가 설정되어 있는 경우, 다른 서버로 재접속을 시도하는 대기 시간을 설정한다. 단위는 초(second)이다. 사용법은 3장의 "JDBC와 Failover" 절을 참고한다. database 기본값 mydb 값의 범위 데이터베이스 이름 필수 여부 No 20 JDBC User's Manual 설정 범위 N/A 설명 접속을 시도할 Altibase 서버에 생성한 데이터베이스의 이름 datasource 기본값 값의 범위 [0 - 65535] 필수 여부 Datasource 사용시 필수 설정 범위 N/A 설명 DataSource 이름 date_format 기본값 ALTIBASE_DATE_FORMAT 환경 변수에 설정된 값. 환경 변수가 설정되어 있지 않으면, 날짜 타입의 입출력 형식은 서버의 설정 값을 따른다. 값의 범위 날짜 형식의 문자열 필수 여부 No 설정 범위 시스템 설명 DATE 타입의 입/출력 포맷을 지정하는 속성이다. 포맷이 설정되면, 클라이언트에서 해당 포맷을 따르지 않은 데이터를 입력할 경우, DATE 타입으로 간주하지 않고, 에러를 반환한다. ddl_timeout 기본값 0 값의 범위 Unsigned Integer 범위내의 숫자값 필수 여부 No 설정 범위 세션 설명 DDL문 수행 시간의 한계값을 설정한다. 수행 시간이 이 시간을 넘어가면 구문의 수행이 취소된다. 단위는 초(sec)이다. 이 값이 0이면 무한대를 의미한다. JDBC 시작하기 21 description 기본값 값의 범위 임의의 문자열 필수 여부 No 설정 범위 N/A 설명 DataSource의 Description 부분 fetch_async 기본값 Off 값의 범위 [off | preferred ] 필수 여부 No 설정 범위 설명 비동기적으로 prefetch를 수행하여 fetch 성능을 향상시킨다. off: 동기적으로 prefetch를 수행한다.(기본값) preferred: 비동기적으로 prefetch를 수행한다. 명령문마다 비동기 prefetch를 설정할 수 있지만 접속 당 하나의 명령문만 prefetch가 비동기적으로 수행된다. fetch_auto_tuning 기본값 on (Linux 인 경우), 이외의 경우는 off 값의 범위 [ on | off ] 필수 여부 No 설정 범위 설명 비동기적으로 prefetch 를 수행할 경우, 네트워크 상태에 따라 auto-tuning 할 것인지 여부를 지정한다. Auto-tuning이란 네트워크 상태에 따라 prefetch row 개수를 자동으로 조절해주는 기능이다. 이 기능은 리눅스에서만 사용할 수 있다. off: auto-tuning 기능을 사용하지 않는다. (리눅스 이외의 OS 에서 기본값) on: auto-tuning 기능을 사용한다. (리눅스에서 기본값) 22 JDBC User's Manual fetch_enough 기본값 0 값의 범위 [0 - 2147483647] 필수 여부 No 설정 범위 세션 설명 현재 세션의 FetchSize를 설정한다. 한 번의 Fetch 연산으로 서버에서 한 번에 가져올 행의 개수를 의미한다. 이 값이 0이면, JDBC 드라이버는 한 네트워크 패킷에 담을 수 있는 최대 크기만큼 서버로부터 데이터를 가지고 온다. fetch_timeout 기본값 60 값의 범위 Unsigned Integer 범위내의 숫자값 필수 여부 No 설정 범위 세션 설명 SELECT문 수행 시간의 한계값을 설정한다. 질의 수행 시간이 설정된 시간을 넘어가면 질의는 자동으로 종료된다. 단위는 초(sec)이다. 이 값이 0이면 무한대를 의미한다. idle_timeout 기본값 0 값의 범위 Unsigned Integer 범위내의 숫자값 필수 여부 No 설정 범위 세션 설명 아무런 작업도 하지 않은 채로 Connection이 연결을 유지하는 시간의 한계값을 설정한다. 이 시간을 넘어가면 접속은 자동으로 해제된다. 단위는 초(sec)이다. 이 값이 0이면 무한대를 의미한다. JDBC 시작하기 23 isolation_level 기본값 값의 범위 [2 | 4 | 8] 필수 여부 No 설정 범위 시스템 설명 2 : TRANSACTION_READ_COMMITTED 4 : TRANSACTION_REPEATABLE_READ 8: TRANSACTION_SERIALIZABLE keystore_password 기본값 N/A 값의 범위 임의의 문자열 필수 여부 No 설정 범위 N/A 설명 keystore_url에 비밀번호를 지정한다. keystore_type 기본값 JKS 값의 범위 [ JKS, JCEKS, PKCS12 외] 필수 여부 No 설정 범위 N/A 설명 keystore_url의 keystore 타입을 설정한다. keystore_url 기본값 N/A 값의 범위 임의의 문자열 필수 여부 No 설정 범위 N/A 설명 KeyStore의 경로를 지정한다. KeyStore는 개인 인증서와 공개 인증서를 가지고 있다. 24 JDBC User's Manual lob_cache_threshold 기본값 8192 값의 범위 [0 - 8192] 필수 여부 No 설정 범위 세션 설명 클라이언트에 캐시할 수 있는 LOB 데이터의 최대 크기를 설정한다. login_timeout 기본값 값의 범위 Unsigned Integer 범위내의 숫자값 필수 여부 No 설정 범위 세션 설명 로그인 대기 최대 시간을 설정한다. 자세한 내용은 3장의 "타임아웃" 절을 참고한다. max_statements_per_session 기본값 값의 범위 Signed Short 범위내의 숫자값 필수 여부 No 설정 범위 세션 설명 한 세션에서 실행 가능한 구문(statement)의 최대 개수를 지정한다. 이 값이 0이면 무한대를 의미한다. ncharliteralreplace 기본값 false 값의 범위 [true | false] 필수 여부 No 설정 범위 세션 설명 SQL문 내에 NCHAR 문자열(리터럴)의 존재 여부를 클라이언트에서 검사할지를 지정한다. JDBC 시작하기 25 prefer_ipv6 기본값 false 값의 범위 [true | false] 필수 여부 No 설정 범위 설명 IPv6 주소를 그대로 사용할 것인지, IPv4로 변환해서 사용할 것인지를 지정한다. 자세한 설명은 "IPv6 접속" 절을 참고하라. password 기본값 값의 범위 필수 여부 Yes 설정 범위 N/A 설명 사용자 ID의 비밀번호 port 기본값 20300 값의 범위 [0 - 65535] 필수 여부 No 설정 범위 N/A 설명 접속을 시도할 Altibase 서버의 포트번호를 지정한다. ssl_enable의 값이 false이면 20300, true이면 20443이 사용된다. privilege 기본값 값의 범위 [normal | sysdba] 필수 여부 No 설정 범위 N/A 설명 접속 모드 normal: 일반 모드 sysdba: DBA 모드 26 JDBC User's Manual query_timeout 기본값 600 값의 범위 Unsigned Integer 범위내의 숫자값 필수 여부 No 설정 범위 세션 설명 질의 수행 시간의 한계값을 설정한다. 수행 시간을 넘어서는 질의는 자동으로 종료된다. 단위는 초(sec)이다. 이 값이 0이면 무한대를 의미한다. remove_redundant_transmission 기본값 0 값의 범위 [0|1] 필수 여부 No 설정 범위 세션 설명 CHAR, VARCHAR, NCHAR, NVARCHAR 타입의 문자열에 중복 데이터 압축 방식을 사용할 것인지를 설정한다. response_timeout 기본값 값의 범위 Unsigned Integer 범위내의 숫자값 필수 여부 No 설정 범위 세션 설명 응답 대기 최대 시간을 설정한다. 자세한 내용은 3장의 "타임아웃" 절을 참고한다. sessionfailover 기본값 off 값의 범위 [on | off] 필수 여부 No 설정 범위 설명 STF(Session Time Failover) 사용 여부를 설정한다. JDBC 시작하기 27 사용법은 3장의 "JDBC와 Failover" 절을 참고한다. server 기본값 localhost 값의 범위 본 매뉴얼의 2장 기본 기능의 "IPv6 접속" 절을 참고한다. 필수 여부 Yes 설정 범위 N/A 설명 접속을 시도할 Altibase 서버의 IP 주소 또는 호스트명 sock_rcvbuf_block_ratio 기본값 0 값의 범위 [ 0 - 216 ] 필수 여부 No 설정 범위 설명 소켓 수신 버퍼의 크기를 32K 단위로 설정한다. 만약 이 속성의 값이 2로 설정되었다면 소켓 수신 버퍼의 크기는 64K 가 된다. 이 속성의 값이 설정되지 않았을 경우, ALTIBASE_SOCK_RCVBUF_BLOCK_RATIO 환경 변수를 참조하여 값을 설정한다. TCP kernel parameter 중 최대 소켓 수신 버퍼 크기가 이 속성값에 의해 설정된 소켓 수신 버퍼 크기 미만으로 설정되어 있을 경우, 이 속성 은 OS에 따라 무시되거나 에러를 발생시킬 수 있다. (Linux OS 인 경우, 'net.core.rmem_max' TCP kernel parameter에 해당된다) ssl_enable 기본값 false 값의 범위 [true | false ] 필수 여부 No 설정 범위 세션 설명 서버에 SSL 통신을 사용해서 접속할지 여부를 28 JDBC User's Manual 설정한다. 자세한 내용은 SSL/TLS User's Guide를 참조한다. time_zone 기본값 DB_TZ(데이터베이스에 설정된 타임존을 이용) 값의 범위 필수 여부 No 설정 범위 세션 설명 타임존을 설정한다. 자세한 내용은 General Reference의 TIME_ZONE 프로퍼티를 참고하도록 한다. truststore_password 기본값 N/A 값의 범위 임의의 문자열 필수 여부 No 설정 범위 N/A 설명 truststore_url의 비밀번호를 지정할 수 있다. truststore_type 기본값 JKS 값의 범위 [ JKS, JCEKS, PKCS12 외] 필수 여부 No 설정 범위 N/A 설명 truststore_url의 TrustStore 타입을 설정한다. truststore_url 기본값 N/A 값의 범위 임의의 문자열 필수 여부 No 설정 범위 N/A 설명 TrustStore의 경로를 지정한다. TrustStore는 CA의 인증서를 갖고있는 KeyStore이다. JDBC 시작하기 29 user 기본값 값의 범위 필수 여부 Yes 설정 범위 N/A 설명 접속할 데이터베이스의 사용자 ID utrans_timeout 기본값 3600 값의 범위 Unsigned Integer 범위내의 숫자값 필수 여부 No 설정 범위 세션 설명 UPDATE문 수행 시간의 한계값을 설정한다. 수행 시간이 이 시간을 넘어가면 구문이 자동으로 종료된다. 단위는 초(sec)이다. 이 값이 0이면 무한대를 의미한다. verify_server_certificate 기본값 true 값의 범위 [true | false ] 필수 여부 No 설정 범위 N/A 설명 서버의 CA 인증서를 인증할지 여부를 설정한다. 이 값을 FALSE로 설정하면, 클라이언트의 애플리케이션은 서버의 CA 인증서를 인증하지 않는다. 30 JDBC User's Manual Statement와 ResultSet 다루기 이 절에서는 JDBC로 Altibase 서버에 연결해서 SQL문을 실행하는 기본적인 방법을 코드 예제로 설명한다. 편의상 exception 처리는 생략한다. 예제 import java.util.Properties; import java.sql.*; //... String sURL = "jdbc:Altibase://localhost:20300/mydb"; String sUser = "SYS"; String sPassword = "MANAGER"; Connection sCon = null; //Set properties for Connection Properties sProps = new Properties(); sProps.put( "user", sUser); sProps.put( "password", sPassword); // Load class to register Driver into DriverManager Class.forName("Altibase.jdbc.driver.AltibaseDriver"); // Create a Connection Object sCon = DriverManager.getConnection( sURL, sProps ); // Create a Statement Object Statement sStmt = sCon.createStatement(); // Execute DDL Type Query sStmt.execute("CREATE TABLE TEST ( C1 VARCHAR (10) )"); // Execute Inserting Query sStmt.execute("INSERT INTO TEST VALUES ('ABCDE')"); // Execute Selecting Query // Get Result Set from the Statement Object ResultSet sRs = sStmt.executeQuery("SELECT * FROM TEST"); // Get ResultSetMetaData Object ResultSetMetaData sRsMd = sRs.getMetaData(); // Retrieve ResultSet while(sRs.next()) { for(int i=1; i<=sRsMd.getColumnCount(); i++) { // Get Actual Data and Printout System.out.println(sRs.getObject(i)); } } // Eliminate ResultSet Resource sRs.close(); JDBC 시작하기 31 // Execute Updating Query sStmt.execute("UPDATE TEST SET C1 = 'abcde'"); // Execute Selecting Query // Get Result Set from the Statement Object sRs = sStmt.executeQuery("SELECT * FROM TEST"); // Get ResultSetMetaData Object sRsMd = sRs.getMetaData(); // Retrieve ResultSet while(sRs.next()) { for(int i=1; i<=sRsMd.getColumnCount(); i++) { // Get Actual Data and Printout System.out.println(sRs.getObject(i)); } } // Eliminate ResultSet Resource sRs.close(); // Execute Deleting Query sStmt.execute("DELETE FROM TEST"); // Execute Selecting Query // Get Result Set from the Statement Object sRs = sStmt.executeQuery("SELECT * FROM TEST"); // Get ResultSetMetaData Object sRsMd = sRs.getMetaData(); // Retrieve ResultSet while(sRs.next()) { for(int i=1; i<=sRsMd.getColumnCount(); i++) { // Get Actual Data and Printout System.out.println(sRs.getObject(i)); } } // Eliminate Resources sRs.close(); sStmt.close(); 32 JDBC User's Manual JDBC Connection Failover 여러 개의 Altibase 서버를 운영하는 환경에서 한 서버의 종료 또는 네트워크 장애 등으로 인해 Altibase JDBC 드라이버를 사용해서 구현한 응용프로그램의 서비스가 불가능해질 수 있다. 이런 장애 상황이 발생하면, 장애가 발생한 서버로 접속하던 클라이언트는 장애 상황을 감지하고, 자동으로 다른 서버로 접속해서 실행 중이던 명령(Statement)들을 처리할 수 있는데 이를 Fail-Over라고 한다. JDBC 애플리케이션에서 Fail-Over 기능을 사용하는 방법은 Replication Manual 의 4장을 참고하기 바란다. 고급 기능 33 2. 기본 기능 Altibase JDBC 드라이버를 사용해서 데이터베이스의 객체를 다루는 기본 방법은 JDBC 표준 인터페이스를 사용하는 방법과 다르지 않다. 이 장에서는 IPv6 주소를 사용해서 데이터베이스 서버에 접속하는 방법과 JDBC 응용 프로그램에서 사용할 수 있는 세 가지 Statement를 비교 설명한다. 34 JDBC User's Manual IPv6 접속 Altibase의 JDBC 드라이버는 JDBC URL에 IPv6 주소와 IPv6 주소로 바뀌어지는 호스트명의 사용을 지원한다. 개요 URL에 IPv6 주소를 명시하려면, 사각 괄호 (“[ ]”)로 주소를 에워싸야 한다. 예를 들어 localhost를 IP주소로 지정할 때, IPv4 주소 127.0.0.1를 쓸 때는 괄호를 사용하지 않는다. 반면 IPv6 주소 [::1]를 사용하려면 괄호를 반드시 사용해야 한다. IPv6 주소 표기법에 대한 자세한 설명은 Administrator’s Manual을 참고하기 바란다. 전제 조건 java.net.preferIPv4Stack IPv6 주소를 사용해서 접속하려면, 클라이언트 실행시 java.net.preferIPv4Stack 속성을 FALSE로 지정해야 한다. 이 속성을 TRUE로 지정하면, 클라이언트 응용프로그램은 IPv6 주소를 사용해서 데이터베이스 서버에 접속할 수 없다. $ java -Djava.net.preferIPv4Stack=false sample [::1] java.net.preferIPv6Addresses java.net.preferIPv6Addresses 속성은 TRUE 또는 FALSE 어느 것을 지정하여도 Altibase JDBC 드라이버에 아무런 영향을 주지 않는다. PREFER_IPV6 URL의 server_ip 속성에 호스트명을 입력하면, PREFER_IPV6 속성에 지정한 값에 따라 JDBC 드라이버가 호스트명을 IPv4 주소 또는 IPv6주소로 변환한다. 이 속성이 TRUE이고 server_ip프로퍼티에 호스트명이 입력되면, 클라이언트 응용프로그램은 먼저 호스트명을 IPv6주소로 바꾼다. 고급 기능 35 그러나 이 속성을 생략하거나 FALSE로 설정하면, 클라이언트 응용프로그램은 먼저 호스트명을 IPv4주소로 바꾼다. 클라이언트 응용프로그램이 처음 접속에 실패하면, 처음과 다른 버전의 IP 주소를 사용해서 접속을 다시 시도할 것이다. 사용법 IPv6 포맷의 IP 주소의 경우 주소값 그대로 지정할 수 있다. 호스트명을 JDBC 드라이버가 IPv4 주소로 변환할지 IPv6주소로 변환할 것인지는 PREFER_IPV6 속성에 지정할 수 있다. Properties sProps = new Properties(); ... sProps.put( "PREFER_IPV6", "FALSE"); 위와 같이 PREFER_IPV6 속성을 FALSE로 지정하면, JDBC 드라이버는 호스트명을 IPv4 주소형으로 변환한다. 만약 PREFER_IPV6 속성이 TRUE이고 호스트명이 주어지면, 클라이언트 응용프로그램은 먼저 호스트명을 IPv6주소로 바꾼다. 이 속성을 생략하거나 FALSE로 설정하면, 클라이언트 응용프로그램은 먼저 호스트명을 IPv4주소로 바꾼다. JDBC드라이버의 기본 동작은 호스트명을 IPv4주소로 바꿔서 시도하는 것이다. 클라이언트 응용프로그램이 선호하는 버전의 IP주소를 사용해서 처음 접속에 실패하면, 다른 버전의 IP주소를 사용해서 접속을 재시도한다. 예제 Connection sCon = null; Properties sProps = new Properties(); sProps.put( "user", "SYS"); sProps.put( "password", "MANAGER"); sProps.put( "PREFER_IPV6", "FALSE"); String sURL = “jdbc:Altibase://localhost:20300/mydb"; Connection sCon = DriverManager.getConnection( sURL, sProps ); 36 JDBC User's Manual Statement, PreparedStatement 및 CallableStatement JDBC에는 직접 SQL 구문 실행 여부 또는 SQL문에 IN/OUT 파라미터 사용 여부에 따라 사용 가능한 명령문(Statement) 객체가 따로 존재한다. 아래는 각 Statement별 PREPARE 가능 여부와 입/출력 파라미터 사용 가능 여부를 표로 나타낸 것이다. PREPARE IN 파라미터 OUT 파라미터 Statement X X X PreparedStatement O O X CallableStatement O O O 1 Statement Statement는 정적인 SQL문을 직접 수행할 때 주로 사용된다. 1 PreparedStatement PreparedStatement는 SQL구문을 먼저 준비(PREPARE)해 두고, 수행하고자 할 때 주로 사용된다. 같은 구문을 여러 번 수행할 때, Statement 대신 PreparedStatement를 사용하면 성능 향상을 기대할 수 있다. Altibase JDBC 드라이버는 PreparedStatement 객체가 생성될 때 서버에서 구문을 PREPARE할 것을 지시한다. 이 때 서버가 PREPARE에 실패하면 에러를 반환하고, JDBC 드라이버는 예외를 던진다. PreparedStatement의 경우 Statement와 달리 입력 파라미터를 사용할 수 있다. 파라미터는 SQL문 내에서 "?" 문자로 나타내며, setXXX() 메소드를 이용해서 값을 설정할 수 있다. 예제 아래는 IN 파라미터와 함께 PreparedStatement를 사용하는 코드 예제이다. PreparedStatement sPrepStmt = sConn.prepareCall("INSERT INTO t1 VALUES (?, ?)"); sPrepStmt.setInt(1, 1); sPrepStmt.setString(2, "string-value"); 고급 기능 37 sPrepStmt.execute(); sPrepStmt.close(); 1 CallableStatement CallableStatement는 입력 또는 출력 파라미터를 함께 사용할 수 있다. CallableStatement는 저장 프로시저 또는 저장 함수 호출에 주로 사용된다. 예제 아래는 입력 파라미터와 출력 파라미터를 함께 CallableStatement를 사용하는 코드 예제이다. CallableStatement sCallStmt = connection().prepareCall("{call p1(?, ?)"); sCallStmt.setInt(1, 1); sCallStmt.registerOutParameter(2, Types.VARCHAR); sCallStmt.execute(); String sOutVal = sCallStmt.getString(2); // todo something ... sCallStmt.close(); 38 JDBC User's Manual 내셔널 캐릭터 셋 사용 여기에서는 JDBC에서 NCHAR 및 NVARCHAR 타입 같은 유니코드 타입에 내셔널 캐릭터 문자열을 사용하는 방법을 설명한다. 데이터 조회 및 변경 JDBC를 이용하여 NCHAR, NVARCHAR 타입의 데이터를 조회 및 변경하는 방법은 CHAR, VARCHAR 타입과 동일하다. 즉 CHAR 타입에서 사용했던 getString, setString 등의 메소드를 그대로 사용하면 된다. 상수 문자열 사용 SQL 구문에서 내셔널 캐릭터를 가지는 상수 문자열을 사용하는 방법은 다음과 같다. 서버와 연결할 때 NcharLiteralReplace 속성을 true로 설정한다. 내셔널 캐릭터의 문자열을 SQL 구문에서 상수 문자열로 사용하기 위해서는 해당 문자열 바로 앞에 ‘N’을 붙인다. 예제 // create table t1 (c1 nvarchar(1000)); Properties sProps; sProps.put( "user", "SYS"); sProps.put( "password", "MANAGER"); sProps.put( "NcharLiteralReplace", "true"); Connection sCon = DriverManager.getConnection( sURL, sProps ); Statement sStmt = sCon.createStatement(); sStmt.execute("insert into t1 values (N'AB가나')"); ResultSet sRS = sStmt.executeQuery( "select * from t1 where c1 like N'%가나%'"); 고급 기능 39 3. 고급 기능 이 장에서는 Altibase JDBC 드라이버가 제공하는 보다 향상된 기능들을 소개하고, 사용법을 설명한다. 40 JDBC User's Manual 자동 생성 키 자동 생성 키(Auto-generated Keys)란 테이블의 각 행을 유일하게 가리킬 수 있는 값으로, 데이터베이스에서 자동으로 생성된다. Altibase에서는 시퀀스(sequence)로 자동 생성 키 역할을 할 수 있다. 이 절에서는 JDBC에서 자동 생성 키 값을 얻는 방법을 설명한다. 사용법 자동 생성 키를 얻기 위해서 먼저 어떤 칼럼에 대해 자동 생성된 키를 얻을 것인지를 명시하는 메소드를 사용해서 Statement 객체를 실행한다. 그리고 getGeneratedKeys() 메소드로 자동 생성된 키의 결과셋을 가져올 수 있다. 또는 어떤 칼럼이 자동 생성된 키 값을 얻을 것인지를 명시하는 메소드를 사용해서 PreparedStatement 객체를 생성하고 실행한 다음, getGeneratedKeys() 메소드로 자동 생성된 키의 결과셋을 가져올 수 있다. 다음은 자동으로 생성된 키를 가져올 수 있는 SQL문을 실행하는 Statement의 메소드들이다. public boolean execute(String aSql, int aAutoGeneratedKeys) throws SQLException; public boolean execute(String aSql, int[] aColumnIndexes) throws SQLException; public boolean execute(String aSql, String[] aColumnNames) throws SQLException; 다음은 자동으로 생성된 키를 가져올 수 있는 PreparedStatement 객체를 생성하는 Connection의 메소드들이다. public PreparedStatement prepareStatement(String aSql, int aAutoGeneratedKeys) throws SQLException; public PreparedStatement prepareStatement(String aSql, int[] aColumnIndexes) throws SQLException; public PreparedStatement prepareStatement(String aSql, String[] aColumnNames) throws SQLException; 위의 두 가지 방법 중 하나를 사용해서 SQL문을 실행한 후, Statement의 아래 메소드를 이용해서 자동 생성된 키를 ResultSet 객체로 얻을 수 있다. public ResultSet getGeneratedKeys() throws SQLException; 고급 기능 41 1 제약 사항 Altibase에서 자동으로 생성된 키를 얻을 때 아래의 제약 사항이 있다. 단순 INSERT 문에 대해서만 지원한다. Altibase는 AUTO INCREMENT 속성의 칼럼을 지원하지 않기 때문에, 오직 시퀀스로부터만 자동 생성 키를 얻을 수 있다. 다음은 자동 생성 키를 얻을 수 있는 SQL문의 예제이다. INSERT INTO t1 (id, val) VALUES (t1_id_seq.nextval, ?); 다음은 자동 생성 키를 얻을 수 없는 SQL문의 예제이다. SELECT * FROM t1; EXEC p1; 자동 생성 키를 만들지 않는 SQL문을 자동 생성 키 생성 플래그(Statement.RETURN_GENERATED_KEYS)와 함께 실행하면 해당 플래그는 무시되고, getGeneratedKeys() 메소드는 빈 결과셋을 반환한다. 1 예제 sStmt.executeUpdate(sQstr, Statement.RETURN_GENERATED_KEYS); ResultSet sKeys = sStmt.getGeneratedKeys(); while (sKeys.next()) { int sKey = sKeys.getInt(1); // do somethings... } sKeys.close(); sStmt.close(); 42 JDBC User's Manual 타임아웃 이 절에서는 Altibase 서버와 연결된 클라이언트 세션에서 발생할 수 있는 타임아웃을 설명하고, 타임아웃과 관련된 프로퍼티를 설정하는 방법을 코드 예제로 보여준다. 로그인 타임아웃 Connection 객체의 connect 메소드를 호출한 후, 서버로부터 응답을 받을 때까지 대기하는 최대 시간을 초과할 때 발생하는 타임아웃이다. 대기하는 최대 시간을 설정하는 속성은 login_timeout이며, 설정 값의 단위는 초(second)이다. 코드 예제 아래는 속성을 설정하는 두 가지 방법을 코드 예제로 보여준다. 1. 타임아웃 속성을 추가한 Properties 객체를 사용해서 Connection 객체를 생성한다. Properties sProps = new Properties(); ... sProps("login_timeout", "100"); ... Connection sCon = DriverManager.getConnection( sUrl, sProps ); 2. 타임아웃 속성을 명시한 연결 URL을 사용해서 Connection 객체를 생성한다. String sUrl = "jdbc:Altibase://localhost:20300/mydb?login_timeout=100"; Connection sCon = DriverManager.getConnection( sUrl ); 응답 타임아웃 Altibase 서버로부터 응답을 기다리는 최대 시간을 초과할 때 발생하는 타임아웃이다. 대기하는 최대 시간을 설정하는 속성은 response_timeout이며, 설정 값의 단위는 초(second)이다. 이 값은 서버와 통신하는 모든 메소드 호출에 적용된다. 고급 기능 43 코드 예제 아래는 응답 타임아웃의 속성을 설정하는 방법을 코드 예제로 보여준다. 1. 타임아웃 속성을 추가한 Properties 객체를 사용해서 Connection 객체를 생성한다. Properties sProps = new Properties(); ... sProps("response_timeout", "100"); ... Connection sCon = DriverManager.getConnection( sUrl, sProps ); 2. 타임아웃 속성을 명시한 연결 URL을 사용해서 Connection 객체를 생성한다. String sUrl = "jdbc:Altibase://localhost:20300/mydb?response_timeout=10 0"; Connection sCon = DriverManager.getConnection( sUrl ); 3. 애플리케이션 실행 시 인자로 전달한다. java ... -DALTIBASE_RESPONSE_TIMEOUT=100 ... 4. 환경 변수를 설정한다. // Linux export ALTIBASE_RESPONSE_TIMEOUT=100 44 JDBC User's Manual DataSource Altibase JDBC 드라이버는 연결 설정을 담고 있는 파일을 사용해서 데이터베이스에 접속하는 방법을 제공한다. 이 때 설정 파일에 포함되어 있는 데이터베이스 서버로의 연결 정보들의 집합을 DataSource라고 한다. DataSource 설정 방법 DataSource는 altibase_cli.ini 파일에 아래의 형식으로 설정한다. # comment [ datasource_name ] Server=localhost # comment Port=20300 User=sys Password=manager 만약 더 추가할 연결 속성이 있다면, “key=value” 형태의 문자열을 줄 단위로 적으면 된다. JDBC 드라이버는 아래 순서의 경로대로 altibase_cli.ini 파일을 찾는다. 1. /altibase_cli.ini 2. $HOME/altibase_cli.ini 3. $ALTIBASE_HOME/conf/altibase_cli.ini DataSource를 이용한 접속 DataSource를 사용해서 서버에 접속하려면, IP 주소와 포트 번호 대신에 altibase_cli.ini 파일에 명시한 DSN(DataSource Name)을 연결 URL에 명시하면 된다. 다음은 DSN을 이용한 연결 URL의 예제이다. jdbc:Altibase://datasource_name jdbc:Altibase://datasource_name:20301 jdbc:Altibase://datasource_name:20301?sys=user wd 연결 URL에 DSN을 명시할 때, port 또는 다른 속성을 추가로 지정할 수 있다. 단, altibase_cli.ini 파일에 지정한 속성을 연결 고급 기능 45 URL에 중복해서 지정하면, 파일의 값은 무시되고 연결 URL에 지정한 속성값이 사용된다. 46 JDBC User's Manual Connection Pool 다음의 방법으로 연결 풀 (Connection Pool)을 설정하고 관리할 수 있다. AltibaseConnectionPoolDataSource 사용: WAS에서 연결 풀을 사용할 때, 이 클래스를 WAS의 JDBC연결 풀 설정에서 지정한다. 6.3.1 버전 이하의 Altibase JDBC 드라이버에서 이 클래스의 이름은 ABConnectionPoolDataSource였다. AltibaseConnectionPoolDataSource에서 설정하는 속성 정보는 아래와 같다. 프로퍼티 이름 설명 databaseName 데이터베이스 이름 dataSourceName dataSource 이름 loginTimeout 데이터베이스 로그인을 위한 최대 대기 시간 logWriter dataSource를 위한 Log writer password 데이터베이스 패스워드 portNumber 데이터베이스 포트 넘버 serverName 데이터베이스 서버명 URL Altibase 연결을 위한 Connection string 정보 (대문자 주의) user 데이터베이스 사용자 ID WAS (Web Application Server) 설정 Altibase는 아래의 웹 애플리케이션 서버와 함께 사용할 수 있다. Tomcat 8.x Code example Context initContext = new InitialContext(); Context envContext = (Context)initContext.lookup("java:/comp/env"); DataSource ds = (DataSource)envContext.lookup("jdbc/altihdb"); Connection conn = ds.getConnection(); // ... WebLogic 12.x 고급 기능 47 Jeus 6.x 웹 애플리케이션 서버에서 JDBC 드라이버와 연결 풀을 설정하고 사용하는 방법에 대해서는 각각의 제품별 매뉴얼을 참조하기 바란다. Tomcat 8.x Apache Tomcat의 설치 및 설정 방법에 대한 자세한 내용은 http://tomcat.apache.org/tomcat-8.0-doc/index.html를 참조하기 바란다. Context configuration 아래와 같이 Context에 JNDI DataSource를 추가한다. web.xml configuration Altibase Datasource example jdbc/altihdb javax.sql.DataSource Container Code example Context initContext = new InitialContext(); Context envContext = (Context)initContext.lookup("java:/comp/env"); DataSource ds = (DataSource)envContext.lookup("jdbc/altihdb"); Connection conn = ds.getConnection(); // ... WebLogic 12.x WebLogic Server의 설치 및 설정 방법에 대한 자세한 내용은 http://docs.oracle.com/middleware/1213/wls/index.html를 참조하기 바란다. 48 JDBC User's Manual 아래의 링크를 참조하여 JDBC datasource와 Connection Pool을 설정할 수 있다. http://docs.oracle.com/middleware/1213/wls/WLACH/tas khelp/jdbc/jdbc_datasources/CreateDataSources.htm l http://docs.oracle.com/middleware/1213/wls/WLACH/pag ehelp/JDBCjdbcdatasourcesjdbcdatasourceconfigconn ectionpooltitle.html Altibase를 위한 설정 옵션은 아래와 같다. 데이터베이스 유형(Database Type): 기타(Other) 드라이버 클래스 이름(Driver Class Name): Altibase.jdbc.driver.AltibaseDriver URL: jdbc:Altibase://localhost:20300/mydb Jeus 6.x $JEUS_HOME/config/JeusMain.xml 파일의 요소를 편집하여 연결 풀을 설정한다. others jdbc/altihdb Altibase.jdbc.driver.AltibaseConnectionPoolDataSource ConnectionPoolDataSource true PortNumber java.lang.Integer 20300 Password java.lang.String MANAGER ServerName java.lang.String localhost ConnectionAttributes java.lang.String ;create=true DatabaseName java.lang.String mydb 고급 기능 49 User java.lang.String SYS 50 JDBC User's Manual Multiple ResultSet Altibase용 PSM(저장 프로시저 및 저장 함수)은 여러 개의 결과셋을 클라이언트에 반환할 수 있다. 이 절에서는 여러 개의 결과셋을 반환하는 PSM의 예제를 가지고, JDBC 애플리케이션에서 이러한 결과셋들을 다루는 방법을 코드 예제로 살펴본다. 다음은 여러 개의 결과셋을 반환하는 PSM 예제이다. CREATE TYPESET my_type AS TYPE my_cur IS REF CURSOR; END; CREATE PROCEDURE p1 (p1 OUT MY_TYPE.MY_CUR, p2 out MY_TYPE.MY_CUR) AS BEGIN OPEN p1 FOR 'SELECT * FROM t1'; OPEN p1 FOR 'SELECT * FROM t2'; END; 다음은 JDBC 애플리케이션에서 PSM 호출로 반환된 여러 개의 결과셋들을 다루는 코드 예제이다. CallableStatement sCallStmt = connection().prepareCall("{call p1()}"); sCallStmt.execute(); ResultSet sRs = null; ResultSetMetaData sRsMd = null; do{ sRs = sCallStmt.getResultSet(); sRsMd = sRs.getMetaData(); if(sRsMd != null) { while(sRs.next()) { // do something for(int i=1; i <= sRsMd.getColumnCount(); i++) { System.out.println(sRs.getString(i)); } } } }while(stmt.getMoreResults()); sCallStmt.close(); 고급 기능 51 JDBC와 Failover 이 절은 Altibase JDBC 애플리케이션에서 Failover 기능을 사용하는 방법을 설명한다. Failover란 Failover란 데이터베이스 서버에 장애가 발생하여 연결이 끊어졌을 때, 애플리케이션이 즉시 다른 서버로 연결을 생성하여 기존에 수행하던 작업을 계속하는 기능을 말한다. Failover는 아래 두 가지 방식으로 동작할 수 있다. CTF(Connection Time Failover) 데이터베이스로의 접속 시도를 실패한 경우, 다른 서버로 접속을 재시도하는 동작 방식이다. CTF는 Connection 객체의 connect 메소드를 호출할 때 발생할 수 있다. STF(Session Time Failover) SQL문을 수행하여 서버로부터 결과를 받기 전에 연결 오류가 발생한 경우, 다른 서버로 접속하여 사용자가 지정한 작업을 계속하는 동작 방식이다. STF는 connect를 제외한 서버와 통신을 하는 모든 메소드 수행 시에 발생할 수 있다. Failover에 대한 자세한 내용은 Replication Manual의 “Failover”장을 참고하도록 한다. 사용 방법 여기에서는 JDBC 애플리케이션에서 CTF 및 STF 기능을 사용하는 방법을 설명한다. CTF Properties 객체에 아래의 속성을 추가해서 CTF 기능을 사용할 수 있다. Properties sProps = new Properties(); sProps.put("alternateservers", "database1:20300, database2:20300"); sProps.put("connectionretrycount", "5"); sProps.put("connectionretrydelay", "2"); sProps.put("sessionfailover", "off"); 52 JDBC User's Manual 각각의 속성에 대한 자세한 설명은 1장의 "연결 속성" 절을 참고하라. STF CTF 기능을 설정하는 속성에 추가로 "SessionFailover=on"을 설정해서 STF 기능을 사용할 수 있다. 데이터베이스 서버로 접속을 시도하는 것을 제외한 통신 상황에서, 클라이언트가 서버의 장애를 감지하면 먼저 CTF 과정을 수행하여 접속을 복원한다. 그 다음, 클라이언트는 사용자가 등록한 콜백 함수를 수행한 후에, 사용자가 Failover 발생을 인지할 수 있도록 Failover Success Exception을 발생시킨다. 이 때 모든 서버로 Failover가 실패하면 드라이버는 원래 발생했던 Exception을 던진다. 아래는 사용자가 작성해야 할 Failover 콜백 함수를 위한 인터페이스이다. public interface AltibaseFailoverCallback { public final static class Event { public static final int BEGIN = 0; public static final int COMPLETED = 1; public static final int ABORT = 2; } public final static class Result { public static final int GO = 3; public static final int QUIT = 4; } int failoverCallback(Connection aConnection, Object aAppContext, int aFailoverEvent); }; 다음은 사용자가 Failover 콜백 함수를 등록하고 해제하는 과정을 보여주는 코드 예제이다. public class UserDefinedFailoverCallback implements AltibaseFailoverCallback { ... public int failoverCallback(Connection aConnection, Object aAppContext, int aFailoverEvent) { // User Defined Code // Result.GO나 Result.QUIT 중 한 가지 값을 반환해야 함. } ... } 고급 기능 53 위의 AltibaseFailoverCallback 인터페이스에 포함된 Event 상수는 사용자가 작성한 Failover 콜백 함수가 JDBC 드라이버에 의해 호출될 때, 콜백 함수의 세 번째 인자인 aFailoverEvent로 전달된다. 각 Event 상수의 의미는 다음과 같다. Event.BEGIN: Session Failover가 시작됨 Event.COMPLETED: Session Failover가 성공하였음 Event.ABORT: Session Failover가 실패하였음 AltibaseFailoverCallback 인터페이스에 포함된 Result 상수는 사용자가 작성하는 콜백 함수에서 반환할 수 있는 값들이다. 콜백 함수에서 Result 상수 이외의 값을 반환하면 Failover가 정상적으로 동작하지 않는다. Result.GO: 콜백 함수에서 이 상수값이 반환되면, JDBC 드라이버는 STF의 다음 과정을 계속해서 진행한다. Result.QUIT: 콜백 함수에서 이 상수값이 반환되면, JDBC 드라이버는 STF 과정을 종료한다. 다음은 사용자가 작성하는 Failover 콜백 함수의 두 번째 인자로 사용할 수 있는 객체의 코드 예제이다. public class UserDefinedAppContext { // User Defined Code } 사용자가 구현한 애플리케이션의 정보를 STF 과정에서 사용할 필요가 있는 경우, Failover 콜백 함수를 등록하면서 콜백 함수에 전달될 객체를 지정할 수 있다. 콜백 함수를 등록하는 registerFailoverCallback 메소드의 두 번째 인자로 이 객체를 지정하면, 실제로 콜백 함수가 호출될 때 이 객체가 전달된다. 다음은 이런 과정을 코드로 나타낸 예제이다. // 사용자 정의 콜백 함수 객체 생성 UserDefinedFailoverCallback sCallback = new UserDefinedFailoverCallback(); // 사용자 정의 애플리케이션 정보 객체 생성 UserDefinedAppContext sAppContext = new UserDefinedAppContext(); ... Connection sCon = DriverManager.getConnection(sURL, sProp); // 사용자 정의 애플리케이션 객체와 함께 콜백 함수 등록 ((AltibaseConnection)sCon).registerFailoverCallback(sCallbac k, sAppContext); ... // 콜백 함수 해제 54 JDBC User's Manual ((AltibaseConnection)sCon).deregisterFailoverCallback(); 코드 예제 STF를 위한 콜백 함수를 구현하는 코드 예제이다. 아래의 예제는 여러 가지 경우를 무시한 단순 코드이므로, 사용자 애플리케이션에서 그대로 사용할 수 없음을 주의해야 한다. public class MyFailoverCallback implements AltibaseFailoverCallback { public int failoverCallback(Connection aConnection, Object aAppContext,int aFailoverEvent) { Statement sStmt = null; ResultSet sRes = null; switch (aFailoverEvent) { // 사용자 어플리케이션의 로직상 Failover 시작 전에 필요한 작업을 진행할 수 있다. case Event.BEGIN: System.out.println(“Failover Started .... “); break; // 사용자 어플리케이션의 로직상 Failover 완료 후에 필요한 작업을 진행할 수 있다. case Event.COMPLETED: try { sStmt = aConnection.createStatement(); } catch( SQLException ex1 ) { try { sStmt.close(); } catch( SQLException ex3 ) { } return Result.QUIT; } try { sRes = sStmt.executeQuery("select 1 from dual"); while(sRes.next()) { if(sRes.getInt(1) == 1 ) { break; } } } catch ( SQLException ex2 ) { try { sStmt.close(); 고급 기능 55 } catch( SQLException ex3 ) { } // Failover 과정을 종료한다. return Result.QUIT; } break; } // Failover 과정을 계속한다. return Result.GO; } } 다음은 STF 성공 여부를 확인하는 코드 예제이다. STF가 성공했는지 실패했는지를 판단하는 방법은 SQLException의 ErrorCode가 Validation.FAILOVER_SUCCESS와 일치하는지 확인하는 것이다. while loop 내에 Failover 검증 코드를 삽입한 이유는 Failover가 성공하더라도 이전에 수행중이던 작업은 다시 수행해야 하기 때문이다. // 반드시 수행하려던 작업을 재수행할 수 있도록 구현해야 한다. // 이 경우에는 while loop를 사용하였다. while (true) { try { sStmt = sConn.createStatement(); sRes = sStmt.executeQuery("SELECT C1 FROM T1"); while (sRes.next()) { System.out.println("VALUE : " + sRes.getString(1)); } } catch (SQLException e) { // Failover 성공 여부 확인 if (e.getErrorCode() == AltibaseFailoverCallback.FailoverValidation.FAILOVER_SUCC ESS) { // Failover가 성공했으므로 Exception을 무시하고 계속 진행한다. continue; } System.out.println("EXCEPTION : " + e.getMessage()); } break; } 56 JDBC User's Manual JDBC Escapes JDBC 스펙은 데이터베이스 제품들에 대해 벤더 특유의 SQL 문법을 JDBC 애플리케이션이 인식할 수 있도록 escape 문법을 제공한다. 즉, escape 문법이 포함된 SQL문에 대해서는 JDBC 드라이버가 자신의 데이터베이스에 맞는 SQL문으로 변환한다. 아래는 JDBC 스펙에서 지원하는 escape가 포함된 SQL문과 Altibase JDBC 드라이버가 이것을 Altibase용으로 변환한 SQL문을 정리한 표이다. 종류 JDBC 스펙에서 지원하는 SQL문 Altibase용으로 변환된 SQL문 ESCAPE SELECT cVARCHAR FROM t1 WHERE cVARCHAR LIKE '%a|%b%' {escape '|'} SELECT cVARCHAR FROM t1 WHERE cVARCHAR LIKE '%a|%b%' escape '|' FN SELECT {fn concat('concat', 'test')} FROM dual SELECT concat('concat', 'test') FROM dual DTS UPDATE t1 SET cDATE = {d '1234-12-30'} UPDATE t1 SET cDATE = to_date('1234-12-30', 'yyyy-MM- dd') UPDATE t1 SET cDATE = {t '12:34:56'} UPDATE t1 SET cDATE = to_date('12:34:56', 'hh24:mi:ss') UPDATE t1 SET cDATE = {ts '2010-01-23 12:23:45'} UPDATE t1 SET cDATE = to_date('2010-01-23 12:23:45', 'yyyy-MM-dd hh24:mi:ss') UPDATE t1 SET cDATE = {ts '2010-11-29 23:01:23.971589'} UPDATE t1 SET cDATE = to_date('2010-11-29 23:01:23.971589', 'yyyy-MM-dd hh24:mi:ss.ff6') CALL {call p1()} execute p1() {? = call p2(?)} execute ? := p2(?) OJ SELECT * FROM {oj t1 LEFT OUTER JOIN t2 ON t1.cINT = t2.cINT} SELECT * FROM t1 LEFT OUTER JOIN t2 ON t1.cINT = t2.cINT 고급 기능 57 ResultSet 사용하기 이 절은 Altibase JDBC 드라이버가 지원하는 ResultSet의 유형과 그 사용법을 설명한다. ResultSet 생성 결과셋은 데이터베이스에 대해 쿼리문을 실행할 때 생성되며, JDBC의 ResultSet 객체에 대응한다. 다음은 JDBC에서 ResultSet 객체를 생성하는 메소드들이다. public Statement createStatement(int aResultSetType, int aResultSetConcurrency) throws SQLException; public Statement createStatement(int aResultSetType, int aResultSetConcurrency, int aResultSetHoldability) throws SQLException; public PreparedStatement prepareStatement(String aSql, int aResultSetType, int aResultSetConcurrency) throws SQLException; public PreparedStatement prepareStatement(String aSql, int aResultSetType, int aResultSetConcurrency, int aResultSetHoldability) throws SQLException; public CallableStatement prepareCall(String aSql, int aResultSetType, int aResultSetConcurrency) throws SQLException public CallableStatement prepareCall(String aSql, int aResultSetType, int aResultSetConcurrency, int aResultSetHoldability) throws SQLException; ResultSet의 유형 JDBC의 ResultSet 객체는 결과셋 내에서 현재 형을 가리키는 커서를 관리하고 유지한다. 기본적인 ResultSet 객체의 커서는 업데이트가 불가능하고 순방향으로만 이동하는 커서이지만, 옵션을 사용해서 스크롤 가능하고 업데이트 가능한 ResultSet 객체를 생성할 수 있다. 다음은 사용자가 지정 가능한 ResultSet 객체의 유형이다. TYPE_FORWARD_ONLY 58 JDBC User's Manual 스크롤이 불가능하며, 커서를 순방향으로만 이동할 수 있다. 데이터베이스 서버에서 커서가 열리는 시점에 결과셋의 데이터가 결정된다. TYPE_SCROLL_INSENSITIVE 스크롤이 가능하므로, 커서를 순방향, 역방향, 또는 위치를 지정해서 이동할 수 있다. 데이터베이스 서버에서 커서가 열리는 시점에 결과셋의 데이터가 결정된다. 서버에서 가져온 결과셋을 클라이언트에 캐시하므로 메모리가 부족할 수도 있다. TYPE_SCROLL_SENSITIVE 스크롤이 가능하므로, 커서를 순방향, 역방향, 또는 위치를 지정해서 이동할 수 있다. 데이터베이스 서버에서 커서가 열리는 시점에 결과셋이 결정되지만, 결과셋 내의 데이터는 클라이언트가 가져오거나 갱신하는 시점에 결정된다. Concurrency ResultSet 객체를 통한 업데이트 허용 여부를 결정하는 옵션이다. 아래의 두 가지 상수 중 하나를 사용할 수 있다. CONCUR_READ_ONLY 업데이트를 허용하지 않는다. 기본값이다. CONCUR_UPDATABLE ResultSet 객체를 이용한 업데이트를 허용한다. Holdability 트랜잭션 커밋 후에도 ResultSet 객체를 유지할 것인지를 결정하는 옵션이다. 아래 두 가지 상수 중 하나를 사용하면 된다. CLOSE_CURSORS_AT_COMMIT 트랜잭션이 커밋 될 때, 커서가 닫힌다. HOLD_CURSORS_OVER_COMMIT 트랜잭션을 커밋하더라도 커서는 유지된다. 커서가 열린 후 한 번이라도 트랜잭션이 커밋되었다면, 그 커서는 이 후의 commit. rollback 수행에도 계속 유지된다. 하지만 커서가 열린 후 한 번도 커밋을 하지 않았다면, 트랜잭션이 rollback될 때 그 커서는 닫힌다. 고급 기능 59 주의사항 ResultSet 객체를 위해 JDBC 드라이버가 클라이언트에 FetchSize에 설정된 개수만큼 행을 캐시하고 있으므로, 커서가 닫히더라도 캐시에 남아있는 데이터는 애플리케이션에서 가져갈 수 있다. 만약 커서가 닫힌 걸 애플리케이션에서 바로 감지하고 싶다면, FetchSize를 1로 설정하면 된다. Altibase JDBC 드라이버의 Holdability 기본값은 CLOSE_CURSORS_AT_COMMIT으로, JDBC 스펙의 기본값인 HOLD_CURSORS_OVER_COMMIT와 다르다. Holdability가 HOLD_CURSORS_OVER_COMMIT인 세션에서는 setAutoCommit() 메소드로 자동커밋 모드를 변경하기 전에 열려 있는 ResultSet 객체를 반드시 닫아야 한다. 아래는 오류가 발생하는 예제 코드이다. sCon = getConnection(); sStmt = sCon.createStatement(); byte[] br; byte[] bb = new byte[48]; for(byte i = 0; i ○1 ○1에서 다음과 같은 exception이 발생한다. java.sql.SQLException: Several statements still open at Altibase.jdbc.driver.ex.Error.processServerError(Error.ja va:320) at Altibase.jdbc.driver.AltibaseConnection.setAutoCommit(Alt ibaseConnection.java:988) at HodabilityTest.testHoldability(HodabilityTest.java:46) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodA ccessorImpl.java:57) 60 JDBC User's Manual at sun.reflect.DelegatingMethodAccessorImpl.invoke(Delegatin gMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:616) exception이 발생하지 않게 하려면 ○1의 sCon.setAutoCommit(true)에 앞서 sRs.close()를 호출해야 한다. ? Holdability 유형이 HOLD_CURSORS_OVER_COMMIT인 ResultSet 객체를 사용하기 위해서는 클라이언트 세션이 Non- Autocommit 모드이거나 clientside_auto_commit 연결 속성이 on으로 설정되어야 한다. clientside_auto_commit 연결 속성을 on으로 설정하면, Holdability 유형이 자동으로 HOLD_CURSORS_OVER_COMMIT으로 변경된다. 예제 Statement sUpdStmt = sConn.prepareStatement("UPDATE t1 SET val = ? WHERE id = ?"); Statement sSelStmt = sConn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.HOLD_CURSORS_OVER_COMMIT); ResultSet sRS = sSelStmt.executeQuery("SELECT * FROM t1"); while (sRS.next()) { // TODO : set parameters sUpdStmt.execute(); sConn.commit(); } sRS.close(); 제약 사항 Updatable ResultSet 또는 Scrollable ResultSet을 사용하기 위해서는 결과셋을 가져오는 SELECT 쿼리문에 다음의 제약 사항이 있다. 업데이트가 가능한 결과셋을 사용하기 위해서는, FROM 절에 한 개의 테이블만 지정할 수 있다. SELECT 리스트에 순수 칼럼만 지정할 수 있다. 수식 또는 함수가 포함될 수 없다. 그리고, NOT NULL 제약조건이 있으면서 DEFAULT값이 없는 칼럼은 SELECT 리스트에 반드시 포함되어야 한다. Scrollable-Sensitive 결과셋을 사용하기 위해서는, FROM 절에 한 개의 테이블만 지정할 수 있다. 고급 기능 61 PSM을 수행하는 경우에는 기본 유형의 ResultSet 객체만 사용할 수 있다. 만약 사용자가 기본 유형이 아닌 옵션을 지정하면, 그 옵션은 무시된다. CONCUR_UPDATABLE하고 TYPE_SCROLL_SENSITIVE한 ResultSet 객체는 JDBC 드라이버 내부적으로 한 개의 Statement를 더 사용하기 때문에, Statement 개수 제약에 더 일찍 도달할 수 있다. 따라서 이러한 유형의 결과셋을 많이 사용하는 경우에는 Statement의 최대 개수를 설정해야 한다. 업데이트가 가능하고 스크롤이 가능한 결과셋은 많은 데이터를 포함하고 있으므로, 일반적으로 순방향 전용의 결과셋에 비해 메모리 사용량이 높다. 따라서 결과셋이 큰 경우에는 메모리가 부족할 수 있으므로, 이러한 유형을 사용하지 않기를 권장한다. ResultSet 객체의 특성은 위에서 설명한 ResultSet 유형, concurrency 유형, 및 holdability 유형으로 결정된다. 사용자는 이들 세 값을 임의의 조합으로 지정할 수 있지만, 결과셋을 만드는 쿼리문에 따라 사용자가 지정한 조합이 허용되지 않을 수도 있다. 이 경우 드라이버는 예외를 발생하지 않고 가능한 조합으로 변환한다. 즉, 아래와 같이 왼쪽 유형이 불가능한 경우 오른쪽 유형으로 자동 변환한다. TYPE_SCROLL_SENSITIVE → TYPE_SCROLL_INSENSITIVE CONCUR_UPDATABLE → CONCUR_READ_ONLY HOLD_CURSORS_OVER_COMMIT → CLOSE_CURSORS_AT_COMMIT 이렇게 내부적으로 변환이 발생하면, 경고를 통해 변환 발생 여부를 확인할 수 있다. Hole 감지 TYPE_SCROLL_SENSITIVE 유형의 ResultSet 객체는 fetch할 때 서버로부터 최신 데이터를 가져온다. 따라서 커서가 열리는 순간에는 보였던 처음의 행이 스크롤 되면서 안 보일 수 있다. 예를 들어, ResultSet 객체에 있던 행이 다른 Statement를 통해 지워진다면, 그 행은 ResultSet 객체에서 더 이상 볼 수 없게 된다. 이렇게 볼 수 없게 된 행을 Hole이라고 한다. 아래는 JDBC에서 Hole을 검출하는 코드 예제이다. while (sRS.next()) { 62 JDBC User's Manual if (sRS.rowDeleted()) { // HOLE DETECTED!!! } else { // do something ... } } Hole에서는 유효한 데이터를 얻을 수 없으며, Hole에 해당하는 ResultSet의 반환값은 다음 중 하나이다: SQL 데이터형의 NULL, 참조형으로는 null, 값으로는 0. Fetch Size Altibase JDBC 드라이버는 성능 향상을 위해, ResultSet 객체를 위한 데이터를 서버로부터 가져올 때 한 행씩 가져오는 대신에 여러 행을 한번에 가져와서 클라이언트에 캐시한다. 이것을 prefetch라고 하며, Statement객체의 setFetchSize() 메소드를 이용해서 한번에 가져오는 행의 개수를 설정할 수 있다. public void setFetchSize(int aRows) throws SQLException; Altibase JDBC 드라이버에서는 0에서 2147483647까지의 값으로 설정할 수 있다. JDBC 스펙에는 이 범위를 벗어난 값을 지정할 때 Exception을 발생하도록 되어 있지만, Altibase JDBC 드라이버는 편의상 예외를 발생하지 않고 무시한다. 0을 설정하면, Altibase 서버가 클라이언트로 한번에 반환할 크기를 스스로 결정한다. 이 경우, 한 행의 크기에 따라 반환되는 행의 개수가 달라질 것이다. FetchSize 값은 Scroll-Sensitive 결과셋에서 특히 중요하다. 사용자가 Scroll-Sensitive 결과셋으로부터 데이터를 가져갈 때, 드라이버는 prefetch한 것을 우선으로 반환한다. 그러므로, 데이터베이스의 데이터가 갱신되었더라도, 그 행이 prefetch한 캐시에 존재하는 한 캐시의 데이터가 사용자에게 반환된다. 사용자가 데이터베이스의 최신 데이터를 보기 원한다면, FetchSize를 1로 하면 된다. 그러나 이런 설정은 서버로부터 데이터를 가져오는 빈도수를 높여 성능을 떨어뜨릴 수 있다. Refreshing Rows ResultSet 객체의 refreshRow() 메소드를 사용하면, SELECT문을 고급 기능 63 실행하지 않고서도 서버로부터 이미 가져온 데이터를 다시 가져올 수 있다. refreshRow() 메소드는 현재 행을 기준으로 FetchSize에 설정된 행 개수만큼 가져온다. 그러므로 이 메소드를 사용하기 위해서는, 커서가 결과셋에서 어떤 행이라도 가리키고 있는 상태이어야 한다. 이 메소드는 ResultSet 객체의 유형이 다음과 같을 때 동작한다. TYPE_SCROLL_SENSITIVE DATABLE TYPE_SCROLL_SENSITIVE AD_ONLY TYPE_FORWARD_ONLY일 경우에는 이 메소드를 호출하면 예외가 발생하고, TYPE_SCROLL_INSENSITIVE일 경우에는 아무런 동작도 일어나지 않는다. 64 JDBC User's Manual Atomic Batch 알티베이스 JDBC 드라이버는 Atomic Batch 기능을 제공하여, 일괄처리(Batch)의 원자성을 보장할 뿐 아니라 대용량의 데이터 삽입을 빠르게 처리할 수 있도록 지원한다. 이 절에서는 알티베이스 JDBC 드라이버가 지원하는 Atomic Batch 사용법에 대하여 설명한다. 사용법 Atomic Batch 기능을 사용하기 위해서 우선 자바 프로그래밍에서 PreparedStatement 객체를 생성하여 AltibasePreparedStatement 클래스 타입으로 캐스팅한다. 다음은 Atomic Batch 기능을 사용하기 위해 호출하는 setAtomicBatch() 메소드이다. public void setAtomicBatch(boolean aValue) throws SQLException Atomic Batch가 PreparedStatement 객체에 설정되었는지 여부를 확인하려면 getAtomicBatch() 메소드를 호출한다. public boolean getAtomicBatch() 1 제약 사항 Altibase에서 Atomic Batch 기능을 사용할 때 아래의 제약 사항이 있다. 단순 INSERT 문에 대해서만 지원한다. 복합 INSERT 문이나 UPDATE, DELETE 등의 DML 문에 대한 정합성을 보장하지 못한다. 트리거가 동작할 때 수행 단위가 Each Statement일 경우 트리거는 한 번만 동작한다. SYSDATE는 1번만 동작한다. 1 예제 ...... 고급 기능 65 Connection con = sConn = DriverManager.getConnection(aConnectionStr, mProps); Statement stmt = con.createStatement(); try { stmt.execute("Drop table " + TABLE_NAME); } catch (SQLException e) { } stmt.execute("create table " + TABLE_NAME + "(c1 VARCHAR (1000))"); PreparedStatement sPrepareStmt = con.prepareStatement("insert into " + TABLE_NAME + " values(?)"); ((AltibasePreparedStatement)sPrepareStmt).setAtomicBatch( true); for(int i = 1; i <= MAX_RECORD_CNT; i++) { sPrepareStmt.setString(1, String.valueOf(i % 50)); sPrepareStmt.addBatch(); if(i%BATCH_SIZE == 0) { sPrepareStmt.executeBatch(); con.commit(); } } con.commit(); } catch (SQLException e) { System.out.println(e.getMessage()); } ...... 66 JDBC User's Manual Date, Time, Timestamp 이 절은 날짜형 데이터 타입인 Date, Time, 및 Timestamp 각각의 의미와, Altibase JDBC 드라이버에서 지원하는 데이터 변환 범위를 설명한다. 의미 Date: 날짜만 표현 Time: 시각을 표현 (날짜가 포함될 수도 있음) Timestamp: 날짜, 시각, 초 및 그 이하의 시각까지 표현 변환 표 아래의 표는 setObject 메소드에 전달되는 객체의 타입에 따라 Altibase JDBC 드라이버가 처리하는 형식을 보여준다. 전달객체 String Date Time Timestamp setObject (DATE) 2134-12-23 00:00:00.0 사용자가 시분초 부분을 입력하면 오류 발생. 드라이버가 0으로 설정함. 2134-12-23 00:00:00.0 시분초는 입력해도 드라이버가 무시함. SQLException: UNSUPPORTED _TYPE_CONVER SION 2134-12-23 12:34:56.123 456 setObject (TIME) 1970-01-01 12:34:56.0 사용자가 년월일 또는 nano초 부분을 입력하면 오류 발생. 드라이버가 2134-12-23 12:34:56.0 2134-12-23 12:34:56.0 2134-12-23 12:34:56.0 고급 기능 67 기준 년월일로 설정함. setObject (TIMESTAMP) 2134-12-23 12:34:56.12 3456 2134-12-23 00:00:00.0 시분초는 입력해도 드라이버가 무시함. SQLException: UNSUPPORTED _TYPE_CONVER SION 2134-12-23 12:34:56.123 456 setString() DATE_FORM AT 속성에 설정한 형식으로 입력해야 함. - - - setDate() - 2134-12-23 00:00:00.0 시분초는 입력해도 드라이버가 무시함. - - setTime() - - 2134-12-23 12:34:56.0 - setTimestamp( ) - - - 2134-12-23 12:34:56.123 456 아래는 데이터베이스에 저장되어 있는 DATE 타입의 값(1234-01- 23 12:23:34.567123)을 getDate(), getTime(), 및 getTimestamp() 메소드를 사용해서 가져오는 값을 보여준다. 함수 반환값 getDate() 1234-01-23 00:00:00.0 getTime() 1234-01-23 12:23:34.0 getTimestamp() 1234-01-23 12:23:34.567123 68 JDBC User's Manual GEOMETRY 이 절은 Altibase가 제공하는 GEOMETY 타입의 데이터를 JDBC 애플리케이션에서 조작하는 방법을 설명한다. 사용 방법 Altibase JDBC 애플리케이션에서는 GEOMETRY 타입의 데이터에 대해 byte 배열을 사용해서 조작할 수 있다. PreparedStatement의 IN 파라미터를 사용해서 데이터베이스의 GEOMETRY 타입 칼럼에 데이터(NULL 포함)를 삽입하는 경우, AltibaseTypes.GEOMETRY 상수를 사용해서 데이터 타입을 반드시 명시해야 한다. 쿼리문에 직접 GEOMETRY 타입의 데이터를 표기하는 방법은 Spatial SQL Reference를 참고하도록 한다. 예제 다음은 JDBC 애플리케이션에서 GEOMETRY 타입의 칼럼에 데이터를 삽입하는 코드 예제이다. int sSize = ... ; byte[] sGeometryData = new byte[sSize]; Connection sConn = ... ; PreparedStatement sPstmt = sConn.prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); sPstmt.setObject(1, sGeometryData, AltibaseTypes.GEOMETRY); sPstmt.executeQuery(); ... 고급 기능 69 LOB 이 절은 Altibase가 제공하는 LOB 타입의 데이터를 JDBC 애플리케이션에서 조작하는 방법을 설명한다. 전제 조건 Altibase가 지원하는 LOB 데이터 타입은 BLOB 및 CLOB이 있으며, 각각 2Gbytes의 최대 크기를 가질 수 있다. LOB 데이터를 정상적으로 다루기 위해서는 세션의 autocommit 모드가 아래의 조건 중 하나를 만족해야 한다. Connection 객체의 setAutoCommit(false)을 사용해서 세션의 자동커밋을 해제(disable)하고 사용자가 수동으로 트랜잭션을 제어해야 한다. Clientside_auto_commit을 on으로 지정하여 JDBC 드라이버가 트랜잭션의 자동커밋을 제어하도록 한다. BLOB 사용하기 아래는 JDBC 애플리케이션에서 BLOB 데이터를 조작하는 방법을 코드 예제로 보여준다. PreparedStatement 객체를 통해서 BLOB 데이터 쓰기 다음은 예제에서 사용되는 테이블을 생성하는 구문이다. CREATE TABLE TEST_TABLE ( C1 BLOB ); setBinaryStream 메소드와 InputStream객체 사용 InputStream sInputStream = ... long sLength = ... ... PreparedStatement sPstmt = connection().prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); ... sPstmt.setBinaryStream(1, sInputStream, sLength); ... 70 JDBC User's Manual sPstmt.execute(); ... setBinaryStream 메소드와 OutputStream객체 사용 byte[] sBuf = ... ... PreparedStatement sPstmt = connection().prepareStatement("SELECT * FROM TEST_TABLE FOR UPDATE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { Blob sBlob = sPstmt.getBlob(1); OutputStream sOutputStream = sBlob.setBinaryStream(1); sOutputStream.write(sBuf); sOutputStream.close(); ... } ... sPstmt.execute(); ... setBlob 메소드와 Blob 객체 사용 java.sql.Blob sBlob = ... ... PreparedStatement sPstmt = connection().prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); ... sPstmt.setBlob(1, sBlob); ... sPstmt.execute(); ... setObject 메소드와 Blob 객체 사용 java.sql.Blob sBlob = ... ... PreparedStatement sPstmt = connection().prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); ... sPstmt.setObject(1, sBlob); 고급 기능 71 ... sPstmt.execute(); ... setObject 메소드에 SQL 타입 지정 java.sql.Blob sBlob = ... ... PreparedStatement sPstmt = connection().prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); ... sPstmt.setObject(1, sBlob); ... sPstmt.execute(); ... ResultSet 객체를 통해서 BLOB 데이터 쓰기 다음은 예제에서 사용되는 테이블을 생성하는 구문이다. CREATE TABLE BLOB_TABLE ( BLOB_COLUMN BLOB ); updateBinaryStream 메소드와 InputStream 객체 사용 InputStream sInputStream = ... long sLength = ... ... PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... sRs.updateBinaryStream(1, sInputStream, sLength); sRs.updateRow(); ... } ... updateBlob 메소드와 Blob 객체 사용 java.sql.Blob sBlob = ... ... 72 JDBC User's Manual PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... sRs.updateBlob(1, sBlob), ; sRs.updateRow(); ... } ... updateObject 메소드와 Blob 객체 사용 java.sql.Blob sBlob = ... ... PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... sRs.updateObject(1, sBlob); sRs.updateRow(); ... } ... updateObject 메소드에 SQL 타입 지정 java.sql.Blob sBlob = ... ... PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... sRs.updateObject(1, sBlob, AltibaseTypes.BLOB); sRs.updateRow(); ... } ... 고급 기능 73 SELECT … FOR UPDATE 구문으로 BLOB 데이터 갱신 byte[] sBytes = new byte[sLength]; ... PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE FOR UPDATE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... Blob sBlob = sRs.getBlob(1); sBlob.setBytes(0, sBytes); ... } ... BLOB 데이터 읽기 getBinaryStream 메소드와 InputStream 객체 사용 ... PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... InputStream sInputStream = sRs.getBinaryStream(1); ... } ... getBlob 메소드와 InputStream 객체 사용 ... PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... Blob sBlob = sRs.getBlob(1); InputStream sInputStream = sBlob.getBinaryStream(); ... } ... 74 JDBC User's Manual getBlob 메소드와 byte 배열 사용 ... final int sReadLength = 100; PreparedStatement sPstmt = connection().prepareStatement("SELECT BLOB_COLUMN FROM BLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... Blob sBlob = sRs.getBlob(1); long sRemains = sBlob.length(); long sOffset = 0; while(sRemains > 0) { byte[] sReadBytes = sBlob.getBytes(sOffset, sReadLength); sRemains -= sReadBytes.length; sOffset += sReadBytes.length; ... } ... } ... BLOB 데이터 변경하기 Truncation Statement sStmt = ... ResultSet sRs = sStmt.executeQuery("SELECT * FROM t1 FOR UPDATE"); while(sRs.next()) { ... int sLength = ... ; Blob sBlob = sRs.getBlob(2); // After executing this method // sBlob.length() == sLength sBlob.truncate(sLength); } ... CLOB 사용하기 아래는 JDBC 애플리케이션에서 CLOB 데이터를 조작하는 방법을 코드 예제로 보여준다. 고급 기능 75 PreparedStatement를 통해서 CLOB 데이터 쓰기 다음은 예제에서 사용되는 테이블을 생성하는 구문이다. CREATE TABLE TEST_TABLE ( C1 BLOB ); setCharacterStream 메소드와 Reader 객체 사용 Reader sReader = ... long sLength = ... ... PreparedStatement sPstmt = connection().prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); ... sPstmt.setCharacterStream(1, sReader, sLength); ... sPstmt.execute(); ... setCharacterStream 메소드와 Writer 객체 사용 char[] sBuf = ... ... PreparedStatement sPstmt = connection().prepareStatement("SELECT * FROM TEST_TABLE FOR UPDATE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { Clob sClob = sPstmt.getClob(1); Writer sWriter = sClob.setCharacterStream(1); sWriter.write(sBuf); sWriter.close(); ... } ... sPstmt.execute(); ... setClob 메소드와 Clob 객체 사용 76 JDBC User's Manual java.sql.Clob sClob = ... ... PreparedStatement sPstmt = connection().prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); ... sPstmt.setClob(1, sClob); ... sPstmt.execute(); ... setObject 메소드와 Clob 객체 사용 java.sql.Clob sClob = ... ... PreparedStatement sPstmt = connection().prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); ... sPstmt.setObject(1, sClob); ... sPstmt.execute(); ... setObject 메소드에 SQL 타입 지정 java.sql.Clob sClob = ... ... PreparedStatement sPstmt = connection().prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); ... sPstmt.setObject(1, sClob, AltibaseTypes.Clob); ... sPstmt.execute(); 고급 기능 77 ... ResultSet 객체를 사용해서 CLOB 데이터 쓰기 다음은 예제에서 사용되는 테이블을 생성하는 구문이다. CREATE TABLE CLOB_TABLE ( CLOB_COLUMN CLOB ); updateCharacterStream 메소드와 Reader 객체 사용 Reader sReader = ... long sLength = ... // The length of source from which Reader is linked ... PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... sRs.updateCharacterStream(1, sReader, sLength); sRs.updateRow(); ... } ... updateClob 메소드와 Clob 객체 사용 java.sql.Clob sClob = ... ... PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... sRs.updateClob(1, sClob); sRs.updateRow(); ... } ... updateObject 메소드와 Clob 객체 사용 java.sql.Clob sClob = ... 78 JDBC User's Manual ... PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... sRs.updateObject(1, sClob); sRs.updateRow(); ... } ... updateObject 메소드에 SQL 타입 지정 java.sql.Clob sClob = ... ... PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE", ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... sRs.updateObject(1, sClob, AltibaseTypes.CLOB); sRs.updateRow(); ... } ... SELECT … FOR UPDATE 구문으로 CLOB 데이터 삽입 ... String sStr = ... ; PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE FOR UPDATE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... Clob sClob = sRs.getClob(1); sClob.setString(0, sStr); ... } ... 고급 기능 79 CLOB 데이터 읽기 getCharacterStream 메소드와 Reader 객체 사용 ... PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... Reader sReader = sRs.getCharacterStream(1); ... } ... getClob 메소드와 Reader 객체 사용 ... PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... Clob sClob = sRs.getClob(1); Reader sReader = sClob.getCharacterStream(); ... } ... getClob 메소드와 String 객체 사용 ... final int sReadLength = 100; PreparedStatement sPstmt = connection().prepareStatement("SELECT CLOB_COLUMN FROM CLOB_TABLE"); ResultSet sRs = sPstmt.executeQuery(); while(sRs.next()) { ... Clob sClob = sRs.getClob(1); long sRemains = sClob.length(); long sOffset = 0; while(sRemains > 0) { String sStr = sClob.getSubString(sOffset, sReadLength); 80 JDBC User's Manual sRemains -= sStr.length; sOffset += sStr.length; ... } ... } ... CLOB 데이터 변경하기 Truncation Statement sStmt = ... ResultSet sRs = sStmt.executeQuery("SELECT * FROM t1 FOR UPDATE"); while(sRs.next()) { ... int sLength = ... ; Clob sClob = sRs.getClob(2); // After executing this method // sClob.length() == sLength sClob.truncate(sLength); } ... 자원 해제하기 많은 수의 LOB 객체를 사용해서 데이터를 획득하는 JDBC 애플리케이션의 경우, 반드시 획득한 LOB 객체를 해제하여야 한다. 또한 트랜잭션을 커밋하는 것과 상관없이 LOB 객체는 명시적으로 해제되어야 한다. 아래는 Blob 객체를 해제하는 코드 예제이다. ... Blob sBlob = sRs.getBlob(1); // Freeing Lob Locator ((Altibase.jdbc.driver.AltibaseLob)sBlob).free(); ... Blob 객체를 free 메소드로 해제하면, 대응하는 Lob Locator가 서버에서 해제되므로 그 객체에 대해서는 더이상 연산 수행이 불가능하다. 아래는 Clob 객체를 해제하는 코드 예제이다. ... 고급 기능 81 Clob sClob = sRs.getClob(1); // Freeing Lob Locator ((Altibase.jdbc.driver.AltibaseLob)sClob).free(); ... Clob 객체도 Blob과 마찬가지로 free 메소드로 해제하면, 대응하는 Lob Locator가 서버에서 해제되므로 그 객체에 대해서는 더 이상 연산 수행이 불가능하다. 아래는 BlobInputStream 객체와 BlobOutputStream 객체를 해제하는 코드 예제이다. InputStream sInputStream = sRs.getBinaryStream(1); // Freeing Lob Locator ((Altibase.jdbc.driver.BlobInputStream)sInputStream).freeLoc ator(); CallableStatement sCallStmt = aConn.prepareCall("INSERT INTO TEST_TABLE VALUES (?)"); sCallStmt.registerOutParameter(1, Types.BLOB); sCallStmt.execute(); Blob sBlob = sCallStmt.getBlob(1); OutputStream sOutputStream = sBlob.setBinaryStream(1); // Freeing Lob Locator ((Altibase.jdbc.driver.BlobOutputStream)sOutputStream).freeL ocator(); BlobInputStream 또는 BlobOutputStream 객체를 freeLocator 메소드로 해제하면, 대응하는 Lob Locator가 서버에서 해제되므로 그 객체에 대해서는 더이상 연산 수행이 불가능하다. 아래는 ClobReader 객체와 ClobWriter 객체를 해제하는 코드 예제이다. Reader sClobReader = sRs.getCharacterStream(1); // Freeing Lob Locator ((Altibase.jdbc.driver.ClobReader)sClobReader).freeLocator() ; CallableStatement sCallStmt = aConn.prepareCall("INSERT INTO TEST_TABLE VALUES (?)"); sCallStmt.registerOutParameter(1, Types.CLOB); sCallStmt.execute(); Clob sClob = sCallStmt.getClob(1); Writer sClobWriter = sClob.setCharacterStream(1); // Freeing Lob Locator ((Altibase.jdbc.driver.ClobWriter)sClobWriter).freeLocator() ; ClobReader 또는 ClobWriter 객체를 freeLocator 메소드로 82 JDBC User's Manual 해제하면, 대응하는 Lob Locator가 서버에서 해제되므로 그 객체에 대해서는 더이상 연산 수행이 불가능하다. 제약 사항 clientside_auto_commit을 on으로 지정하여 JDBC 드라이버가 트랜잭션의 자동커밋을 제어하도록 하여도 LOB 데이터를 다루는 것에는 아래와 같은 제약이 여전히 존재한다. ResultSet 객체(커서)를 통해 가져온 LOB 데이터를 커서가 닫히기 전에 다른 Statement의 executeUpdate() 메소드에 사용하면 Lob locator가 사라지기 때문에 그 커서로부터 더 이상의 fetch가 불가능해진다. 아래는 이러한 오류 상황이 발생할 수 있는 예제 코드이다. PreparedStatement sPreStmt = sCon.prepareStatement( "INSERT INTO TEST_TEXT " + "VALUES ( ?, ?, ?, ? )" ); Statement sStmt = sCon.createStatement(); ResultSet sRS = sStmt.executeQuery( "SELECT ID, TEXT " + " FROM TEST_SAMPLE_TEXT " ); while ( sRS.next() ) -> ○2 { sID = sRS.getInt( 1 ); sClob = sRS.getClob( 2 ); switch ( sID ) { case 1 : sPreStmt.setInt( 1, 1 ); sPreStmt.setString( 2, "Altibase Greetings" ); sPreStmt.setClob( 3, sClob ); sPreStmt.setInt( 4, (int)sClob.length() ); break; case 2 : sPreStmt.setInt( 1, 2 ); sPreStmt.setString( 2, "Main Memory DBMS" ); sPreStmt.setClob( 3, sClob ); sPreStmt.setInt( 4, (int)sClob.length() ); break; default : break; } sPreStmt.executeUpdate(); -> ○1 } ○1: ResultSet sRS가 열려 있는 상태에서 sPreStmt.executeUpdate()를 호출하면, JDBC 드라이버가 트랜잭션을 자동으로 commit하면서 sClob의 Lob locator가 사라진다. ○2: Lob locator가 사라졌으므로 sRs.next()에서 exception이 발생할 수 있다. 고급 기능 83 따라서, 이러한 로직에서 LOB 데이터를 다룰 때는 먼저 setAutoCommit(false)를 호출하여 세션의 자동커밋을 해제해야 한다. 84 JDBC User's Manual Autocommit 제어 Altibase JDBC 애플리케이션에서는 auto_commit 연결 속성 또는 JDBC Connection 객체의 setAutoCommit 메소드를 사용해서 세션의 자동커밋(autocommit) 모드를 정할 수 있다. 사용자가 auto_commit=true 또는 setAutoCommit(true) 메소드를 사용해서 자동커밋을 설정(enable)하면, Altibase 서버가 트랜잭션을 자동으로 커밋한다. 연결 속성 clientside_auto_commit을 이용해서 자동커밋 모드를 설정할 수도 있다. 연결 속성 clientside_auto_commit을 on으로 지정하면, Altibase 서버 대신에 JDBC 드라이버가 트랜잭션을 자동으로 커밋한다. clientside_auto_commit을 off로 설정한 경우에는 세션의 자동커밋 모드가 setAutoCommit 메소드에 의해 결정된다. 세션의 자동커밋을 해제(disable)하려면 setAutoCommit(false)을 호출하면 된다. clientside_auto_commit=on인 세션에서도 setAutoCommit(false)을 호출하면 자동커밋은 해제되며, JDBC 드라이버의 자동 커밋 모드로 전환하려면 setAutoCommit(true)를 호출하면 된다. 자동커밋이 해제되면, 사용자가 commit() 또는 rollback() 메소드를 사용해서 트랜잭션을 수동으로 커밋하거나 롤백해야 한다. 자동커밋 모드를 설정하고 해제하는 방법을 정리하면 아래의 표와 같다. Autocommit 모드 설정 방법 서버에서 트랜잭션 자동커밋 auto_commit=true(또는 미지정) or setAutoCommit(true) JDBC 드라이버에서 트랜잭션 자동커밋 auto_commit=true(또는 미지정) and clientside_auto_commit=on 자동커밋 해제 auto_commit=false or setAutoCommit(false) 고급 기능 85 BIT, VARBIT 이 절은 BIT, VARBIT 타입의 데이터를 JDBC 애플리케이션에서 조작하는 방법과 주의사항을 설명한다. 사용 방법 Altibase JDBC 애플리케이션에서는 Java BitSet 클래스를 사용하여 BIT, VARBIT 타입의 데이터를 조작할 수 있다. PreparedStatement의 IN 파라미터를 사용할 때는 Types.BIT로 타입을 지정하거나, 지정하지 않을 때에는 BitSet 또는 문자열로 값을 지정할 수 있다. 주의사항 비트가 '0'으로 끝나는 BIT, VARBIT 값을 만들려면, 특정 길이의 비트 값으로 구성할 수 있는 AltibaseBitSet 클래스 또는 문자열의 값을 사용해야 한다. Java BitSet은 어떤 비트를 set()했는지 기억하도록 구현된 것으로, 0으로 구성된 특정 길이의 BIT 값은 만들 수 없기 때문이다. 예제 다음은 JDBC 애플리케이션에서 BIT, VARBIT 타입의 칼럼에 데이터를 삽입하는 코드 예제이다. ... BitSet sBitSet1 = new BitSet(); sBitSet1.set(1); BitSet sBitSet2 = new AltibaseBitSet( 5 ); sBitSet1.set(2); PreparedStatement sPstmt = sConn.prepareStatement("INSERT INTO TEST_TABLE VALUES (?)"); sPstmt.setObject(1, sBitSet1, Types.BIT); sPstmt.executeUpdate(); sPstmt.setObject(1, sBitSet2); sPstmt.executeUpdate(); sPstmt.setObject(1, "0110100", Types.BIT); sPstmt.executeUpdate(); ... 86 JDBC User's Manual JDBC 로깅 JDBC 로깅(JDBC Logging)은 Altibase JDBC 드라이버에서 발생하는 각종 로그를 기록하는 것을 의미하며, java.util.logging 패키지를 이용하여 관련된 로그를 기록할 수 있다. 이 절에서는 JDBC 로깅을 하기 위한 설정 방법 및 사용법을 설명한다. JDBC 로깅 설정 방법 JDBC 드라이버로부터 로그를 남기려면 로깅 기능이 추가된 JDBC jar 파일을 사용해야 한다. 그리고 ALTIBASE_JDBC_TRACE 환경 변수에서 로깅 기능을 활성화한 후 사용하면 된다. JRE버전 JRE 1.5 이상이 설치되어야 JDBC 로깅을 사용할 수 있으며, 이외의 라이브러리는 필요하지 않다. CLASSPATH 설정 로깅을 사용하려면 CLASSPATH 환경변수에 Altibase_t.jar 파일을 추가해야 한다. ex) 유닉스 환경에서 bash 쉘을 사용하는 경우 export CLASSPATH=$ALTIBASE_HOME/lib/Altibase_t.jar:.:$CL ASSPATH 로깅 활성화 JVM 파라미터를 이용하여 ALTIBASE_JDBC_TRACE 환경 변수를 아래와 같이 TRUE로 설정하면, 클라이언트의 프로그램 수정 없이 글로벌하게 로깅 기능이 활성화된다. 그러나 ALTIBASE_JDBC_TRACE의 변경 값을 적용하려면, 클라이언트 프로그램을 재시작해야 한다. java -DALTIBASE_JDBC_TRACE=true ... 고급 기능 87 JDBC 로깅 사용법 java.util.logging 파일 설정 java.util.logging 설정은 $JRE_HOME/lib/logging.properties 파일에서 설정하거나, 아래와 같이 java.util.logging.config.file를 이용하여 별도로 설정할 수 있다. java - Djava.util.logging.config.file=$ALTIBASE_HOME/sample/JDBC /Logging/logging.properties - DALTIBASE_JDBC_TRACE=true ... 알티베이스는 $ALTIBASE_HOME/sample/JDBC/Logging 디렉토리에 logging.properties 샘플 파일을 제공하고 있으며, 이를 참조하여 사용하거나, 직접 설정 파일을 생성하여 Djava.util.logging.config.file 프로퍼티를 통해 사용하면 된다. Logger의 종류 로거는 트리 구조로 구성되어 있으며 부분별로 로그의 양이나 셋팅을 조절할 때 사용한다. 알티베이스 JDBC 드라이버에서 지원하는 Logger의 종류는 아래와 같다. Logger 설명 altibase.jdbc 알티베이스 JDBC 메시지 (Connection, Statement, PreparedStatement 등의 JDBC API call) altibase.jdbc.pool 커넥션 풀 관련 메시지 altibase.jdbc.rowset ResultSet 관련 메시지 altibase.jdbc.xa xa 관련 메시지 altibase.jdbc.failover failover 관련 메시지 altibase.jdbc.cm CmChannel 네트워크 패킷 메시지 Logger 레벨 logger에 레벨을 설정하면 보다 상세하게 로그의 양을 조절할 수 있다. 알티베이스 JDBC 드라이버에서 제공하는 레벨은 아래와 같으며, SEVERE에서 FINEST으로 갈수록 상세한 로그를 남긴다. CONFIG레벨을 설정하면 SEVERE, WARNING, INFO, CONFIG 레벨의 로그들이 남는다. Logger 레벨 설명 88 JDBC User's Manual OFF 로그를 남기지 않는다. SEVERE SQLException이나 내부 에러가 발생했을 때 해당 에러만 로그에 남긴다. WARNING SQLWarning을 로그에 남긴다. INFO JDBC 드라이버 내부적으로 특정 객체의 상태를 모니터링하여 로그에 남긴다. CONFIG JDBC 드라이버 내부적으로 어떤 SQL문이 실행되는지 확인할 때 주로 사용한다. PreparedStatement같은 경우 prepare할 때 sql이 표시되며, Statement는 execute 할 때 sql이 표시된다. 이때 sql이 실행되는데 걸린 시간이 milli sec 단위로 같이 표시된다. FINE 표준 JDBC API에 진입하고 리턴될 때 해당 인자 값과 반환 값을 로그에 남긴다. API에 진입할 때마다 로그가 남기 때문에 로그의 양이 많아질 수 있으며, Connection이나 Statement가 close되는데 걸린 시간이 추가로 표시된다. FINEST JDBC 드라이버와 알티베이스 서버가 주고 받는 패킷 정보를 로그로 남긴다. 로그의 양이 가장 많다. logging.properties 다음은 로그 레벨을 CONFIG로 하고, 네트워크 패킷 로그를 남기는 샘플 logging.properties이며, $ALTIBASE_HOME/sample/JDBC/Logging/logging.properties 에서도 내용을 참조할 수 있다. handlers= java.util.logging.FileHandler, java.util.logging.ConsoleHandler --> 기본적인 handler로 FileHandler와 ConsoleHandler를 추가한다. .level = CONFIG --> 루트 logger 레벨을 CONFIG로 셋팅한다. # default file output is in same directory. java.util.logging.FileHandler.level = CONFIG java.util.logging.FileHandler.pattern = ./jdbc_trace.log java.util.logging.FileHandler.limit = 10000000 java.util.logging.FileHandler.count = 1 java.util.logging.FileHandler.append = false 고급 기능 89 java.util.logging.FileHandler.formatter = Altibase.jdbc.driver.logging.SingleLineFormatter --> java.util.logging.FileHandler의 기본셋팅을 설정하는 부분이다. sql정보만 보면 되기때문에 FileHandler의 레벨을 CONFIG으로 설정했다. java.util.logging.ConsoleHandler.level = CONFIG java.util.logging.ConsoleHandler.formatter = Altibase.jdbc.driver.logging.SingleLineFormatter --> java.util.logging.ConsoleHandler를 설정하는 부분이다. 로그를 한 줄로 출력하기 위해 SingleLineFormatter를 사용했다. altibase.jdbc.level = CONFIG altibase.jdbc.rowset.level = SEVERE altibase.jdbc.cm.level = FINEST altibase.jdbc.cm.handlers = Altibase.jdbc.driver.logging.MultipleFileHandler #altibase.jdbc.cm.handlers = java.util.logging.FileHandler --> altibase jdbc logger를 설정하는 부분으로 레코드 셋의 정보는 제외해야 하기 때문에 rowset의 레벨을 SEVERE로 설정했다. 네트워크 패킷 정보는 로그로 남겨야 하기 때문에 cm의 레벨을 FINEST로 설정했다. 또한 네트워크 패킷같은 경우 세션별로 파일을 별도 저장하기 위해 handler로 MultipleFileHandler를 사용했다. Altibase.jdbc.driver.logging.MultipleFileHandler.level = FINEST Altibase.jdbc.driver.logging.MultipleFileHandler.pattern = ./jdbc_net_%s.log Altibase.jdbc.driver.logging.MultipleFileHandler.limit = 10000000 Altibase.jdbc.driver.logging.MultipleFileHandler.count = 1 Altibase.jdbc.driver.logging.MultipleFileHandler.formatter = java.util.logging.XMLFormatter --> MultipleFileHandler를 설정하는 부분으로 pattern에 jdbc_net_%s.log를 사용해 세션의 아이디별로 파일이 생성되도록 설정했다. 또한 formatter로 XMLFormatter를 사용해 XML형태의 파일에 로그가 생성되도록 설정했다. 90 JDBC User's Manual Hibernate Altibase는 비표준SQL을 제공하며, Hibernate는 이러한 기능을 수행할 수 있도록 Dialect 클래스를 지원한다. Hibernate에서 Altibase를 연동하려면 Altibase의 JDBC Driver를 설정하고, Hibernate의 configuration에 AltibaseDialect.class를 지정해야 한다. AltibaseDialect Hibernate가 공식적으로 제공하는 라이브러리는 AltibaseDialect.class를 포함하지 않기 때문에 AltibaseDialect.java파일 (필요에 따라 AltibaseLimitHandler.java포함)을 컴파일하고 Hibernate가 제공하는 파일에 포팅해야 사용할 수 있다. AltibaseDialect.java파일과 AltibaseLimitHandler.java파일은 Altibase Github사이트에서 제공한다. 상세한 사용 방법은 AltibaseDialect 포팅 방법 (https://github.com/ALTIBASE/hibernate- orm/blob/master/ALTIBASE_DIALECT_PORTING.md)을 참고한다. Tips ation 91 4. Tips ation 이 장은 Altibase JDBC 드라이버를 효율적으로 사용하기 위한 방법을 제시한다. 92 JDBC User's Manual 성능을 위한 팁 아래는 JDBC 애플리케이션의 성능을 향상시키기 위해 염두에 두어야 할 몇 가지 사항이다. JDBC 애플리케이션에서 LOB 데이터를 조작할 때에는 Stream 또는 Writer 객체를 사용할 것을 권장한다. 만약 사용할 LOB 데이터의 크기가 8192바이트 이하일 경우, Lob_Cache_Threshhold 연결 속성을 적절한 값으로 설정하도록 한다. 하나의 Connection 객체에 한 가지 작업을 수행할 것을 권장한다. 예를 들어, 한 Connection 객체에 여러 개의 Statement 객체를 생성하여 작업을 수행하면 성능 저하가 발생할 수도 있다. Connection 객체의 생성, 소멸이 빈번할 경우, 미들웨어(WAS)에서 제공하는 Connection Pool을 사용할 것을 권장한다. Connection을 맺고 끊는 작업은 다른 연산에 비해 비교적 비용이 크기 때문이다. 에러 메시지 93 5. 에러 메시지 이 장은 Altibase JDBC 드라이버를 사용하면서 발생할 수 있는 오류의 SQL State를 기술한다. 94 JDBC User's Manual SQL States SQLSTATE에 반환되는 문자열 값은 클래스를 나타내는 처음 2개의 문자와 그 뒤에 서브클래스를 나타내는 3개의 문자로 이루어진다. 클래스는 상태를 나타내고 서브클래스는 세부 상태를 나타낸다. 아래는 Altibase JDBC 드라이버에서 발생할 수 있는 SQLState의 종류와 그 의미를 간략하게 정리한 표이다. Condition Class Subcondition Subclass connection exception 08 Communication link failure S01 Invalid packet header version P01 Fail-Over completed F01 Invalid format for alternate servers F02 Invalid packet next header type P02 Invalid packet sequence number P03 Invalid packet serial number P04 Invalid packet module ID P05 Invalid packet module version P06 Invalid operation protocol P07 Invalid property id: %s P08 Invalid connection URL U01 Unknown host H01 There are no available data source configurations D01 connection failure 006 SQL-client unable to establish SQL- connection 001 Unsupported Algorithm K01 Could not create keystore instance K02 Could not load keystore K03 에러 메시지 95 Invalid kestore url K04 Could not open keystore file K05 Key management exception occurred K06 Could not retreive key from keystore K07 Default algorithm definition invalid K08 Mandatory properties that are supported for the client version are not supported for the server version. M01 dynamic SQL error 07 This statement returns result set(s) R01 Invalid query string Q01 Statement has not been executed yet S01 no data 02 The sql statement does not produce a result set 001 warning 01 cursor operation conflict 001 Invalid connection string attribute S00 Batch update exception occurred: %s B00 There are no batch jobs B01 There are existing some batch jobs B02 The query cannot be executed while batch jobs are executing B03 Binding cannot be permitted during executing batch jobs B04 Fetch operation cannot be executed during batch update B05 There are too many added batch jobs B31 96 JDBC User's Manual Statement has already been closed C01 The result set has already been closed C02 The stream has already been closed C03 additional result sets returned 00D This result set doesn't retain data R01 Attempt to return too many rows in only one fetch operation R02 Option value changed S02 Invalid value for bitset V01 feature not supported 0A 000 Cannot change the name of the database C01 The read only mode in transaction cannot be supported C02 Not supported operation on forward only mode T01 Not supported operation on read only mode T02 violate the JDBC specification V01 syntax error or access rule violation 42 Invalid type conversion 001 Column not found S22 JDBC internal error JI 000 Overflow occured on dynamic array which is defined by JDBC D01 Underflow occured on dynamic array which is defined by JDBC D02 This result set was created by JDBC driver's internal statement D03 Connection thread is interrupted D04 Remaining data exceeds the max size of the primitive type D05 Packet Operation has been twisted P01 에러 메시지 97 Invalid method invocation I01 cardinality violation 21 Insert value list does not match column list S01 data exception 22 000 null value not allowed 004 invalid parameter value 023 Insufficient number of parameters P01 IN type parameter needed P02 OUT type parameter needed P03 There is no column which needs to bind parameter. P04 Statement ID mismatch V01 Error occured from InputStream S01 The length between actual lob data and written lob data into the communication buffer is different. L01 invalid transaction state 25 branch transaction already active 002 savepoint exception 3B Cannot set savepoint at auto- commit mode S01 Invalid savepoint name V01 Invalid savepoint V02 Not supported operation on named savepoint N01 Not supported operation on un- named savepoint N02 invalid schema name 3F 000 Explain Plan Error EP EXPLAIN PLAN is set to OFF S01 General Error HY There are too many allocated statements 000 98 JDBC User's Manual Associated statement is not prepared 007 Attribute cannot be set now 011 Invalid string or buffer length 090 Invalid cursor position 109 Empty ResultSet R01 Timeout expired T00 XA error XA XA open failed F01 XA close failed F02 XA recover failed F03 부록 A: 데이터 타입 맵핑 99 A. 부록: 데이터 타입 맵핑 이 부록은 Altibase의 데이터 타입과 JDBC 표준 데이터 타입, Java 데이터 타입간에 호환 여부를 기술한다. 100 JDBC User's Manual 데이터 타입 맵핑 아래의 표는 JDBC 데이터 타입, Altibase JDBC의 데이터 타입, 및 Java 언어의 타입 간에 기본적으로 맵핑되는 관계를 보여준다. JDBC 타입 Altibase 타입 Java 타입 CHAR CHAR String VARCHAR VARCHAR String LONGVARCHAR VARCHAR String NUMERIC NUMERIC BigDecimal DECIMAL NUMERIC BigDecimal BIT VARBIT BitSet BOOLEAN - - TINYINT SMALLINT Short SMALLINT SMALLINT Short INTEGER INTEGER Integer BIGINT BIGINT Long REAL REAL Float FLOAT FLOAT BigDecimal DOUBLE DOUBLE Double BINARY BYTE byte[] VARBINARY BLOB Blob LONGVARBINARY BLOB Blob DATE DATE Timestamp TIME DATE Timestamp TIMESTAMP DATE Timestamp CLOB CLOB Clob BLOB BLOB Blob ARRAY - - DISTINCT - - STRUCT - - REF - - 부록 A: 데이터 타입 맵핑 101 DATALINK - - JAVA_OBJECT - - NULL - null - GEOMETRY byte[] 102 JDBC User's Manual Java 데이터형을 데이터베이스 데이터형으로 변환하기 아래의 표는 setObject 메소드를 사용해서 파라미터에 객체를 설정할 경우, 각 객체 별로 어떠한 데이터베이스 데이터입으로 변환이 가능한지를 보여준다. SMALLINT INTEGER BIGINT REAL FLOAT DOUBLE DECIMAL/NUMERIC BIT CHAR VARCHAR/LONGVARCHAR BINARY VARBINARY/LONGVARBINARY DATE TIME TIMESTAMP BLOB CLOB Array Blob ○ Boolean ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ byte[] ○ ○ ○ ○ ○ char[] ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ Clob ○ Double ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ Float ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ Integer ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ Java class BigDecimal ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ java.net.URL java.sql.Date ○ ○ ○ ○ ○ java.sql.Time ○ ○ ○ ○ ○ java.sql.Timestamp ○ ○ ○ ○ ○ java.util.BitSet ○ Long ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ Ref Short ○ ○ ○ ○ ○ ○ ○ ○ ○ String ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ Struct InputStream ○ Reader ○ 부록 A: 데이터 타입 맵핑 103 데이터베이스 데이터형을 Java 데이터형으로 변환하기 아래의 표는 데이터베이스의 각 데이터형에 대해 getXXX 메소드를 사용해서 변환이 가능한지를 보여준다. SMALLINT INTEGER BIGINT REAL FLOAT DOU BLE DECIMAL/NUMERIC BIT CHAR/VARCHAR LONGVARCHAR BINARY VARBINARY/LONGVARBINARY DATE TIME TIMESTAMP CLOB BLOB getArray getAsciiStream ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getBigDecimal ○ ○ ○ ○ ○ ○ ○ ○ ○ getBinaryStream ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getBlob ○ ○ getBoolean ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getByte ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getBytes ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getCharacterStream ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getClob ○ getDate ○ ○ ○ ○ ○ getDouble ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getFloat ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getInt ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getLong ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getObject ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getRef getShort ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getString ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ ○ getTime ○ ○ ○ ○ ○ getTimestamp ○ ○ ○ ○ ○ 찾아보기 105 찾아보기 A alternateservers 17 altibase_cli.ini 44 ALTIBASE_JDBC_TRACE 86 AltibaseBitSet 85 AltibaseDialect 90 app_info 17, 21, 27 Atomic Batch 64 auto_commit 17, 84 autocommit 제어 84 Auto-generated Keys 40 B BIT 85 BitSet 85 BLOB 69 C CallableStatement 37 ciphersuite_list 18 CLASSPATH 12, 86 clientside_auto_commit 18, 84 CLOB 74 CLOSE_CURSORS_AT_COMMIT 58 CONCUR_READ_ONLY 58 CONCUR_UPDATABLE 58 Concurrency 58 Connection Pool 46, 92 connectionretrycount 19 connectionretrydelay 19 D database 19 datasource 20 DataSource 44 Date 66 date_format 20 ddl_timeout 20 defer_prepares 17 description 21 DSN(DataSource Name) 44 F Failover 32, 51 CTF 51 STF 52 Fetch Size 62 fetch_enough 22 fetch_timeout 22 FetchSize 59 G GEOMETRY 68 H Hibernate 90 HOLD_CURSORS_OVER_COMMIT 58 Holdability 58 Hole 61 I idle_timeout 22 IPv6 접속 34 isolation_level 23 J java.net.preferIPv4Stack 34 java.net.preferIPv6Addresses 34 JDBC Escapes 56 JDBC Logging 86 Jeus 47, 48 JRE 86 K keystore_password 23 keystore_type 23 keystore_url 23 106 JDBC User's Manual L LOB 69 Lob_Cache_Threshhold 92 lob_cache_threshold 24 login_timeout 24, 42 M max_statements_per_session 24 Multiple ResultSet 50 N ncharliteralreplace 24 P password 25 port 25 prefer_
- [Altibase 7.1] JDBC User's Manual
-
- [Altibase 7.1] Adapter for JDBC User's Manual
ㅣ 2017-07-06
- Altibase® Tool Adapter for JDBC User’s Manual Release 7.1 (August 28, 2018) ----------------------------------------------------------- Altibase Tool Adapter for JDBC User’s Manual Release 7.1 Copyright ⓒ 2001~2018 Altibase Corp. All R
-
미리보기
Altibase® Tool Adapter for JDBC User’s Manual Release 7.1 (August 28, 2018) ----------------------------------------------------------- Altibase Tool Adapter for JDBC User’s Manual Release 7.1 Copyright ⓒ 2001~2018 Altibase Corp. All Rights Reserved. 본 문서의 저작권은 ㈜알티베이스에 있습니다. 이 문서에 대하여 당사의 동의 없이 무단으로 복제 또는 전용할 수 없습니다. ㈜알티베이스 08378 서울시 구로구 디지털로 306 대륭포스트타워Ⅱ 10층 전화: 02-2082-1114 팩스: 02-2082-1099 고객서비스포털: http://support.altibase.com homepage: http://www.altibase.com ----------------------------------------------------------- 목차 3 목 차 서문 ......................................................................................................................... 5 이 매뉴얼에 대하여 ......................................................................................................................... 6 1. 소개 ................................................................................................................ 11 Adapter for JDBC ............................................................................................................................ 12 2. 설치와 설정 .................................................................................................. 15 설치전 작업 ....................................................................................................................................... 16 설치 ....................................................................................................................................................... 18 설치 후 작업 ..................................................................................................................................... 21 설정 ....................................................................................................................................................... 22 프로퍼티 .............................................................................................................................................. 23 3. 사용법 ............................................................................................................ 31 jdbcAdapter 제약조건 .................................................................................................................. 32 구동과 종료 ....................................................................................................................................... 34 데이터 타입 ....................................................................................................................................... 36 Adapter for JDBC 유틸리티 ....................................................................................................... 37 커맨드 라인 옵션............................................................................................................................ 39 FAQ ........................................................................................................................................................ 42 jdbcAdapter 사용시 DDL 수행 순서 .................................................................................... 44 찾아보기 ............................................................................................................... 47 서문 5 서문 6 Adapter for JDBC User’s Manual 이 매뉴얼에 대하여 이 매뉴얼은 Altibase에서 변경된 데이터를 JDBC를 지원하는 다른 데이터베이스에 복제하는 유틸리티인 Adapter for JDBC에 대해 설명한다. 대상 사용자 이 매뉴얼은 다음과 같은 Altibase 사용자를 대상으로 작성되었다. 데이터베이스 관리자 응용 프로그램 개발자 기술지원부 다음과 같은 배경 지식을 가지고 이 매뉴얼을 읽는 것이 좋다. 컴퓨터, 운영 체제 및 운영 체제 유틸리티 운용에 필요한 기본 지식 관계형 데이터베이스 사용 경험 또는 데이터베이스 개념에 대한 이해 컴퓨터 프로그래밍 경험 데이터베이스 서버 관리, 운영 체제 관리 또는 네트워크 관리 경험 소프트웨어 환경 이 매뉴얼은 데이터베이스 서버로 Altibase 6.3.1 또는 그 이상의 버전을 사용한다는 가정 하에 작성되었다. 이 매뉴얼의 구성 이 매뉴얼은 다음과 같이 구성되어 있다. 제 1장 소개 이 장은 Adapter for JDBC의 개념과 Altibase에서 변경된 데이터가 다른 데이터베이스에 복제되는 동작 구조를 설명한다. 제 2 장 설치와 환경설정 이 장에서는 Adapter for JDBC를 설치하고 설정하는 방법을 설명한다. 서문 7 제 3 장 사용법 이 장에서는 Adapter for JDBC를 사용하는 방법에 대해 자세히 설명한다. A. 부록 FAQ B. 부록 jdbcAdapter 사용시 DDL 수행 순서 문서화 규칙 이 절에서는 이 매뉴얼에서 사용하는 규칙에 대해 설명한다. 이 규칙을 이해하면 이 매뉴얼과 설명서 세트의 다른 매뉴얼에서 정보를 쉽게 찾을 수 있다. 여기서 설명하는 규칙은 다음과 같다. 구문 다이어그램 샘플 코드 규칙 구문 다이어그램 이 매뉴얼에서는 다음 구성 요소로 구축된 다이어그램을 사용하여, 명령문의 구문을 설명한다. 구성 요소 의미 예약어 명령문이 시작한다. 완전한 명령문이 아닌 구문 요소는 화살표로 시작한다. 명령문이 다음 라인에 계속된다. 완전한 명령문이 아닌 구문 요소는 이 기호로 종료한다. 명령문이 이전 라인으로부터 계속된다. 완전한 명령문이 아닌 구문 요소는 이 기호로 시작한다. ; 명령문이 종료한다. SELECT 필수 항목 NOT 선택적 항목 ADD DROP 선택사항이 있는 필수 항목. 한 항목만 제공해야 한다. 8 Adapter for JDBC User’s Manual ASC DESC 선택사항이 있는 선택적 항목 , ASC DESC 선택적 항목. 여러 항목이 허용된다. 각 반복 앞부분에 콤마가 와야 한다. 샘플 코드 규칙 코드 예제는 SQL, Stored Procedure, iSQL 또는 다른 명령 라인 구문들을 예를 들어 설명한다. 아래 테이블은 코드 예제에서 사용된 인쇄 규칙에 대해 설명한다. 규칙 의미 예제 [ ] 선택 항목을 표시 VARCHAR [(size)] [[FIXED |] VARIABLE] { } 필수 항목 표시. 반드시 하나 이상을 선택해야 되는 표시 { ENABLE | DISABLE | COMPILE } | 선택 또는 필수 항목 표시의 인자 구분 표시 { ENABLE | DISABLE | COMPILE } [ ENABLE | DISABLE | COMPILE ] . . . 그 이전 인자의 반복 표시 예제 코드들의 생략되는 것을 표시 SQL> SELECT ename FROM employee; ENAME ----------------------- SWNO HJNO HSCHOI . . . 20 rows selected. 그 밖에 기호 위에서 보여진 기호 이 외에 기호들 EXEC :p1 := 1; acc NUMBER(11,2); 기울임 꼴 구문 요소에서 사용자가 지정해야 하는 변수, 특수한 값을 SELECT * FROM table_name; CONNECT userID/password; 서문 9 제공해야만 하는 위치 지정자 소문자 사용자가 제공하는 프로그램의 요소들, 예를 들어 테이블 이름, 칼럼 이름, 파일 이름 등 SELECT ename FROM employee; 대문자 시스템에서 제공하는 요소들 또는 구문에 나타나는 키워드 DESC SYSTEM_.SYS_INDICES_; 관련 자료 자세한 정보를 위하여 다음 문서 목록을 참조하기 바란다. Installation Guide Administrator’s Manual Replication Manual Log Analyzer User's Manual iSQL User’s Manual Utilities Manual Error Message Reference 온라인 매뉴얼 Altibase 고객서비스포털(http://support.altibase.com)에서 매뉴얼(PDF, HTML)을 받을 수 있다. Altibase는 여러분의 의견을 환영합니다. 이 매뉴얼에 대한 여러분의 의견을 보내주시기 바랍니다. 사용자의 의견은 다음 버전의 매뉴얼을 작성하는데 많은 도움이 됩니다. 보내실 때에는 아래 내용과 함께 고객서비스포털(http://support.altibase.com/kr/)로 보내주시기 바랍니다. 사용 중인 매뉴얼의 이름과 버전 매뉴얼에 대한 의견 사용자의 성함, 주소, 전화번호 이 외에도 Altibase 기술지원 설명서의 오류와 누락된 부분 및 기타 기술적인 문제들에 대해서 이 주소로 보내주시면 정성껏 처리하겠습니다. 또한, 기술적인 부분과 관련하여 즉각적인 도움이 10 Adapter for JDBC User’s Manual 필요한 경우에도 고객서비스포털을 통해 서비스를 요청하시기 바랍니다. 여러분의 의견에 항상 감사드립니다. jdbcAdpater 소개 11 1. 소개 이 장은 Adapter for JDBC의 개념과 구조, 그리고 Altibase에서 변경된 데이터가 다른 데이터베이스에 복제되는 동작 구조를 설명한다. 12 Adapter for JDBC User’s Manual Adapter for JDBC Altibase Adapter for JDBC(이하 'jdbcAdapter'라 칭한다)는 Altibase에서 변경된 데이터를 JDBC를 지원하는 다른 데이터베이스에 적용하는 유틸리티이다. 이는 Altibase 에서 제공하는 Altibase Log Analysis API를 이용하여 구현되었다. 구조와 개념 사용자가 Altibase에서 변경된 데이터를 다른 데이터베이스(Other DB)로 복제하기 위해서는 아래 그림에 보이는 것처럼 먼저 Altibase, jdbcAdapter 및 사용하려는 JDBC를 지원하는 타사의 데이터베이스를 설치해야 한다. jdbcAdapter는 Altibase Log Analysis API (이하 ALA라 칭한다)와 Java data base connectivity (JDBC)를 사용하여 구현되었다. ALA는 Altibase에서 변경된 데이터를 수신할 때 사용되고, JDBC는 데이터를 보낼 대상이 되는 다른 데이터베이스로 데이터를 전송할 때 사용된다. ALA에 대한 자세한 설명은 Log Analyzer User’s Manual을 참고하기 바란다. 아래 그림은 jdbcAdapter가 어떻게 Altibase에서 다른 데이터베이스로 데이터를 복제하는지를 보여준다. jdbcAdpater 소개 13 그림 1 Adapter for JDBC의 구조 1. 사용자가 데이터를 삽입하거나 수정할 때, Altibase 서버 내의 XLog 송신자는 XLog와 메타 정보를 생성하여 XLog 콜렉터에게 전송한다. 메타 정보는 handshaking 시에만 전송한다. 2. jdbcAdapter 내에 존재하는 XLog 콜렉터는 XLog와 메타 정보를 사용자에게 제공하기 위해 ALA를 사용한다. ALA 호출에 실패하면, 트레이스 로그가 trc 디렉터리의 파일에 기록된다. 3. jdbcAdapter는 획득한 데이터를 다른 데이터베이스에 적용하기 위해 ALA를 사용하여 데이터를 변환한다. 4. jdbcAdapter는 변환된 데이터를 JNI를 통해 JDBC를 사용하여 다른 데이터베이스에 적용한다. 용어 14 Adapter for JDBC User’s Manual XLog 리두 로그를 논리적인 형태로 변환한 로그이다. 변경 DML (INSERT/UPDATE/DELETE) 구문과 관련된 트랜잭션의 이력을 저장한다. XLog 송신자 XLog 송신자는 액티브 리두 로그를 분석하여 XLog 형태로 변환하고 이를 XLog 콜렉터에게 전달한다. XLog 송신자는 handshaking과 XLog 전송을 주로 담당한다. XLog 콜렉터 XLog 콜렉터는 메타 데이터와 XLog를 XLog 송신자로부터 받는다. XLog 콜렉터는 메타 데이터, XLog 큐, 트랜잭션 테이블 및 XLog 풀을 가지고 있다. Handshaking Handshaking은 XLog 송신자가 XLog 콜렉터에게 XLog를 보내기 전에 프로토콜 버전과 메타 데이터를 확인하는 작업이다. Log Analysis API Altibase가 제공하는 인터페이스로써, jdbcAdapter를 구현할 때 사용된다. 주로 XLog와 XLog를 해석하는데 사용되는 메타 정보를 구하는데 사용된다. 설치와 설정 15 2. 설치와 설정 이 장에서는 Adapter for JDBC를 설치하고 사용환경을 설정하는 방법을 설명한다. 16 Adapter for JDBC User’s Manual 설치전 작업 jdbcAdapter를 설치하고 실행하기 위해서는 다음의 시스템 요구사항을 만족해야 한다. 또한 jdbcAdpater가 올바르게 작동하려면 몇가지 시스템 환경 설정도 필요하다. 시스템 요구사항에 대해 보다 자세히 알고 싶으면, Altibase 고객서비스포털(http://support.altibase.com/kr/)로 연락 바란다. 운영체제 현재 아래의 운영체제에서만 jdbcAdapter를 지원한다. LINUX : x86-64bit 데이터베이스 버전 Altibase : 버전 6.3.1 이상 버전 지원 OTHER DB : JDBC 4.1 이하 버전의 데이터베이스 지원 데이터베이스 문자집합 데이터를 저장하기 위한 기본 캐릭터셋이다. 국가 문자집합 데이터베이스 문자집합이 지원하지 않는 언어에 해당하는 데이터는 NCHAR 또는 NVARCHAR 타입을 사용해서 저장할 수 있다. JDBC 드라이버 설치 jdbcAdapter를 사용하기 위해 jdbcAdapter가 동작하는 장비에 JDBC 드라이버를 설치한다. 이 때 설치하는 JDBC 드라이버는 복제대상 데이터베이스의 벤더가 제공하는 것이다. 예를 들어 복제대상 데이터베이스가 오라클이라면 오라클 홈페이지에서 Oracle 데이터베이스 서버 버전과 일치하는 버전의 JDBC 설치와 설정 17 드라이버를 다운로드하여 설치한다. JRE 설치 jdbcAdapter는 JRE 7 버전 이상에서 동작하는 응용 프로그램이므로, jdbcAdapter가 운영될 장비에 7 버전 이상의 JRE가 설치되어 있어야 한다. jdbcAdapter가 접속할 원격 데이터베이스의 JDBC 드라이버가 7 이상 버전의 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} $ export LD_LIBRARY_PATH=$JAVA_HOME/jre/lib/amd64/server:${ LD_ LIBRARY_PATH ) 18 Adapter for JDBC User’s Manual 설치 DISPLAY 환경변수 설정이 올바르게 되어 있다면 jdbcAdapter 인스톨러를 GUI모드로 실행할 수도 있다. 이 매뉴얼은 GUI모드로 수행하는 것을 가정하여 jdbcAdapter 설치에 대해 기술하였다. 또한 디스플레이 설정이 적절히 되어 있지 않거나 GUI를 사용할 수 없을 경우에는, 텍스트 모드로 jdbcAdapter를 설치하는 것도 가능하다. jdbcAdapter 설치 jdbcAdapter는 원본 DB의 Altibase 서버 계정이 아닌 다른 사용자 계정에 설치하는 것을 권장한다. 1. 첫 번째 작업은 jdbcAdapter를 운영할 시스템에 맞는 jdbcAdapter 인스톨러의 버전을 결정하는 것이다. 아래의 그림은 jdbcAdapter 인스톨러의 명명 규칙을 보여준다. 2. 인스톨러를 실행하면 다이얼로그 박스가 나타난다. 설치하려는jdbcAdapter의 버전을 확인한 후, “Forward” 버튼을 누른다. 3. 다음 다이얼로그 박스에서는jdbcAdapter를 설치할 디렉터리를 선택한다. 기본으로 설치하고 있는 사용자 계정의 홈 디렉터리 내에 jdbcAdapter라는 디렉터리를 생성하게 된다. 4. jdbcAdapter를 사용하려면 Altibase Log Analyzer (ALA) 프로퍼티 설정을 다음처럼 해야 한다. 프로퍼티에 대한 자세한 설명은 이 장의 뒷 부분에 있는 “ALA 프로퍼티”절을 참고한다. ALA_SENDER_IP: Altibase가 설치된 장비의 IP 주소이다. Altibase와 jdbcAdapter가 같은 장비에서 실행되는 것을 가정하여 기본값은 127.0.0.1이다. ALA_RECEIVER_PORT: jdbcAdapter가 데이터를 수신하기 위해 설치와 설정 19 사용하는포트 번호이다. 1024에서 65536사이의 값으로 설정해야 한다. ALA_REPLICATION_NAME: Altibase에 존재하는 이중화 객체의 이름이다. ALA_XLOG_POOL_SIZE: XLog 풀의 최대 크기를 설정한다. 기본값은 10,000 XLog 개수이다. ALA_SOCKET_TYPE: ALA가 사용할 통신 소켓 타입을 설정한다. jdbcAdapter는 TCP/IP와 UNIX Domain소켓을 지원한다. ALA_LOGGING_ACTIVE: ALA가 트레이스 로그를 남길 것인지 여부를 지정한다. 이 프로퍼티 값이 1이면 트레이스 로그를 남긴다. 기본값은 1이다. 5. 다음 다이얼로그 박스에서는 Altibase 프로퍼티 설정을 해야 한다. 프로퍼티에 대한 자세한 설명은 이 장의 뒷 부분에 있는 “제약조건 확인용 프로퍼티”절을 참고한다. ALTIBASE_USER: Altibase에 접근할 사용자의 이름이다. ALTIBASE_PASSWORD: Altibase에 접근할 사용자 계정의 암호이다. ALTIBASE_IP: Altibase가 설치된 장비의 IP 주소이다. Altibase 와 jdbcAdapter가 같은 장비에서 작동하는 것을 가정하여, 이 프로퍼티의 기본값은 127.0.0.1이다. ALTIBASE_PORT: Altibase 서버가 대기하고 있는 포트 번호이다. 1024에서 65536사이의 값으로 설정해야 한다. 6. jdbcAdapter를 사용하려면 Other DB 프로퍼티를 적절히 설정해야 한다. 프로퍼티에 대한 자세한 설명은 이 장의 뒷 부분에 있는 “외부 데이타베이스의 프로퍼티”와 “DML 관련 프로퍼티”절을 참고한다. OTHER_DATABASE_USER: 데이터를 전송할 대상이 되는 Other DB에 접근할 사용자의 이름이다. OTHER_DATABASE_PASSWORD: 데이터를 전송할 대상이 되는 Other DB에 접근할 사용자의 암호이다. OTHER_DATABASE_SKIP_INSERT: “Yes”를 선택하면, Altibase에서 실행된 INSERT 구문은 Other DB에 적용되지 않는다. OTHER_DATABASE_SKIP_UPDATE: “Yes”를 선택하면, Altibase에서 실행된 UPDATE 구문은 Other DB에 적용되지 않는다. OTHER_DATABASE_SKIP_DELETE: “Yes”를 선택하면, Altibase에서 실행된 DELETE 구문은 Other DB에 적용되지 20 Adapter for JDBC User’s Manual 않는다. OTHER_DATABASE_GROUP_COMMIT: 복수의 트랜잭션을 한 번에 처리하는 기능이다. OTHER_DATABASE_BATCH_DML_MAX_SIZE: "Batch DML"은 여러 개의 DML 구문을 일괄 처리하는 것을 의미한다. 이 프로퍼티는 최대 몇 개의 DML 구문을 일괄 처리 할것 인지를 지정한다. Batch DML기능을 사용하지 않으려면, 이 프로퍼티를 1로 설정한다. OTHER_DATABASE_SET_USER_TO_TABLE : Other DB에 DML을 적용할 때 타겟 테이블의 사용자를 XLog Sender에서 지정한 사용자로 한다. 기능을 사용하지 않으려면 이 프로퍼티를 0으로 설정한다. OTHER_DATABASE_JDBC_MAX_HEAP_SIZE : JVM에서 사용하는 Heap의 Max Size를 설정한다. OTHER_DATABASE_JDBC_DRIVER_PATH : Other DB를 위한 JDBC 드라이버 경로를 지정한다 OTHER_DATABASE_JDBC_DRIVER_CLASS : Other DB JDBC 드라이버 클래스 이름을 설정한다 OTHER_DATABASE_JDBC_CONNECTION_URL : Other DB의 연결 URL을 지정한다 7. jdbcAdapter의 사용과 관련된 모든 프로퍼티의 설정이 끝나면, 설정된 값을 보여주는 다이얼로그 박스가 나타난다. 모든 프로퍼티가 올바로 설정되었는지 확인하고 “Forward”를 클릭한다. 8. “Ready to Install” 다이얼로그 박스에서 “Forward”를 누르면, 설치를 시작한다. 9. jdbcAdapter가 설치되는 동안, 다음의 두 환경 변수가 설정된다. 시스템에 새로운 환경 변수가 적용되게 하려면, 로그아웃 후에 다시 로그인 해야한다. JDBC_ADAPTER_HOME: 이 환경 변수는 설치 과정의 앞 단계에서 지정한 jdbcAdapter 홈 디렉터리를 값으로 갖게 된다. PATH: 이 환경 변수에는 $JDBC_ADAPTER_HOME/bin 경로가 추가된다. 10. 성공적으로 설치가 완료된 후에, 완료 다이얼로그 박스가 나타난다. 설치와 설정 21 설치 후 작업 환경 변수 설정 jdbcAdapter 설치 후 환경 변수 설정, 라이브러리 경로 추가 및 데이터베이스 문자집합과 국가 문자집합 설정을 해야 한다. 환경 변수 설정에 대한 자세한 설명은 이 장의 뒷 부분에 있는 “설정” 절을 참고한다. JDBC_ADAPTER_HOME 이 환경변수는 jdbcAdapter 설치 시에 자동으로 설정된다. ALTIBASE_NLS_USE 이 환경변수에는 Altibase에서 사용하는 문자 집합을 지정한다. 문자 집합에 대한 자세한 설명은 Getting Started Guide를 참고한다. 설치 디렉터리 확인 jdbcAdapter 설치가 완료 후 bin, conf, msg 및 trc 디렉터리가 $JDBC_ADAPTER_HOME 디렉터리 아래에 생성되었는지 확인한다. 각 디렉터리의 구조와 역할은 다음과 같다. bin 디렉터리 이 디렉터리에는 jdbcAdapter (Adapter for JDBC)와 oaUtility (Adapter for JDBC 유틸리티) 실행 파일과 내부적으로 사용되는 파일들이 위치한다. conf 디렉터리 이 디렉터리에는 jdbcAdapter 프로퍼티 설정을 저장하는 jdbcAdapter.conf 파일이 위치한다. msg 디렉터리 jdbcAdapter 설치 중 에러가 발생하면, 트레이스 로그에 에러 메시지가 기록되는데, 이 디렉터리 내의 메시지 파일에 있는 에러 메지지가 사용된다. trc 디렉터리 jdbcAdapter는 이 디렉터리의 파일에 트레이스 로그를 기록한다. 22 Adapter for JDBC User’s Manual 설정 jdbcAdapter를 사용하려면 다음의 환경 변수를 설정해야 한다. JDBC_ADAPTER_HOME jdbcAdapter가 설치된 디렉터리를 설정하는 환경변수이다. 이 환경 변수는 jdbcAdapter 설치 중에 자동으로 설정된다. ALTIBASE_NLS_USE ALA에서 사용하기 위한 Altibase에서 사용하는 문자 집합을 지정한다. 문자 집합에 대한 자세한 내용은 Getting Started Guide > 다국어 지원을 참고한다. 설치와 설정 23 프로퍼티 jdbcAdapter 프로퍼티들은 ALTIBASE Log Analyzer와 JDBC가 사용하고, jdbcAdapter의 동작방식을 결정하기 위해서도 사용된다. 프로퍼티 파일은 $JDBC_ADPATER_HOME/conf 디렉터리에 존재하는 jdbcAdapter.conf이다. jdbcAdapter에 사용되는 프로퍼티들은 아래처럼 분류된다. ALA 프로퍼티 제약조건 확인용 프로퍼티 데이터를 보낼 대상이 되는 다른 데이터베이스의 프로퍼티 DML 관련 프로퍼티 ALA 프로퍼티 jdbcAdapter가 Altibase Log Analyzer (ALA)를 사용하기 위해서는 다음의 프로퍼티를 설정해야 한다. ALA 프로퍼티에 대한 더 자세한 설명은 Log Analyzer User’s Manual 을 참고한다. ALA_SENDER_IP XLog 송신자의 IP 주소를 지정하는 프로퍼티이다. Altibase가 설치된 서버 장비의 IP 주소를 설정하도록 한다. 기본 값: 127.0.0.1 ALA_RECEIVER_PORT XLog 콜렉터가 XLog를 수신하기 위해 사용하는 포트 번호를 지정하는 프로퍼티이다. jdbcAdpater가 대기하고 있는 포트 번호를 지정하도록 한다. 범위: 1024 - 65535 ALA_SENDER_REPLICATION_PORT Altibase 서버에 ALA 이중화 객체가 구동되어 있는 상태에서 Adapter를 구동할 때 ALA 이중화 송신자와 접속되는 방식을 지정한다. 기본 값: 0 24 Adapter for JDBC User’s Manual 범위: 0 ~ 65535 0: ALA 이중화 객체의 송신자가 접속을 시도할때까지 Adapter 가 대기한다. (Altibase 서버의 REPLICATION_SENDER_SLEEP_TIMEOUT 속성값에 의존한다). 1 이상: 해당 포트번호로 Adapter가 이중화 송신자와 직접 접속을 시도한다 ALA_RECEIVE_XLOG_TIMEOUT (단위: 초) XLog 콜렉터가 XLog를 수신하기 위해 대기하는 시간을 지정하는 프로퍼티이다. 기본 값: 300 범위: 1 - 4294967295 ALA_REPLICATION_NAME XLog 송신자로 사용되는 이중화 객체의 이름을 지정하는 프로퍼티이다. Altibase 내에 생성된 이중화 객체의 이름과 동일하다. ALA_SOCKET_TYPE Altibase Log Analyzer가 사용할 소켓의 종류를 지정하는 프로퍼티이다. jdbcAdapter는 TCP/IP와 UNIX Domain 소켓을 지원한다. 그러다 Unix Domain 소켓을 사용하려면, Altibase와 jdbcAdapter가 같은 장비에 위치해야 한다. TCP: TCP/IP 소켓 사용 (기본값) UNIX: UNIX Domain 소켓 사용 ALA_XLOG_POOL_SIZE (단위: 개수) jdbcAdapter의 XLog 풀의 최대 크기를 지정하는 프로퍼티이다. 기본 값: 10,000 범위: 1 - 2147483647 ALA_LOGGING_ACTIVE Altibase Log Analyzer가 트레이스 로그를 출력할 것인지를 지정하는 프로퍼티이다. 0: 트레이스 로그를 출력하지 않는다. 설치와 설정 25 1: 트레이스 로그를 출력한다 (기본 값) 제약조건 확인용 프로퍼티 ALTIBASE_USER Altibase에 접속할 사용자의 이름을 지정하는 프로퍼티이다. ALTIBASE_PASSWORD Altibase에 접속할 사용자 계정의 암호를 지정하는 프로퍼티이다. ALTIBASE_IP Altibase가 설치된 서버 장비의 IP 주소를 지정하는 프로퍼티이다. 기본 값: 127.0.0.1 ALTIBASE_PORT Altibase가 대기하고 있는 포트 번호를 지정하는 프로퍼티이다. 범위: 1024 - 65535 ADAPTER_ERROR_RESTART_COUNT (단위: 횟수) Adapter의 모든 오류에 대한 부가적인 동작을 지정한다. 기본 값: 0 범위: 0 ~ 65535 0: Adapter를 종료하면서 에러메세지를 출력한다 1 이상: "Adapter 재시작 및 연동대상 DBMS 접속/레코드 반영" 을 지정된 횟수만큼 수행한다. 지정된 횟수를 초과하면 Adapter를 종료하면서 에러메세지를 출력한다. ADAPTER_ERROR_RESTART_INTERVAL (단위: 초) ADAPTER_ERROR_RESTART_COUNT에 지정한 값 만큼 재시도할 때의 간격을 지정한다. 기본 값: 0 범위: 0 ~ 65535 0: 간격을 두지않고 바로 재시도한다. 26 Adapter for JDBC User’s Manual 외부 데이타베이스의 프로퍼티 jdbcAdapter에서 데이터를 보낼 대상이 되는 Other DB를 사용하기 위해서는 다음의 프로퍼티들을 설정해야 한다. OTHER_DATABASE_USER 데이터를 보낼 대상이 되는 Other DB에 접속할 사용자 계정의 이름을 지정하는 프로퍼티이다. OTHER_DATABASE_PASSWORD 데이터를 보낼 대상이 되는 Other DB에 접속할 사용자 계정의 암호를 지정하는 프로퍼티이다. OTHER_DATABASE_JDBC_MAX_HEAP_SIZE (단위: Mega Bytes) JVM이 사용하는 Heap의 최대 크기를 설정한다. 기본 값: 2048 범위: 0 - 10240 JVM이 Heap의 최대 크기를 자동으로 설정하게 하려면, 이 프로퍼티를 0으로 지정한다. OTHER_DATABASE_JDBC_DRIVER_PATH Other DB용 JDBC 드라이버 경로를 지정한다. OTHER_DATABASE_JDBC_DRIVER_CLASS Other DB 용 JDBC Driver 클래스 이름을 설정한다. OTHER_DATABASE_JDBC_CONNECTION_URL Other DB의 연결 URL을 지정한다. DML 관련 프로퍼티 Altibase에서 실행된 DML 구문들을 데이터를 보낼 대상이 되는 Other DB에도 적용할지 여부를 결정하는 프로퍼티들이다. OTHER_DATABASE_GROUP_COMMIT 설치와 설정 27 복수의 트랜잭션을 한 번에 처리할 수 있다. 원본 Altibase 서버에서 커밋을 하여도, 대상 Tagert DB는 일정한 수준의 트랜잭션이 모일 때까지 커밋을 연기한다. 따라서 전체 성능은 향상될 수 있지만 개별 트랜잭션의 응답 시간은 지연될 수 있다. 기본 값: 1 0: 그룹 커밋을 하지 않는다. 1: 그룹 커밋을 한다. OTHER_DATABASE_BATCH_DML_MAX_SIZE (단위: 개수) “Batch DML”은 같은 종류인 복수의 DML 구문을 일괄 처리하는 것을 의미한다. 이는 네트워크 비용을 줄임으로써 성능 향상을 가져온다. 기본 값: 10 범위: 1 - 32767 Batch DML을 끄려면, 이 프로퍼티를 1로 지정한다. OTHER_DATABASE_ERROR_RETRY_COUNT (단위: 횟수) 레코드를 반영할 때 오류가 발생할 경우 재시도 횟수를 의미한다. 기본 값: 0 범위: 0 ~ 65535 0: 재시도하지 않는다. OTHER_DATABASE_ERROR_RETRY_INTERVAL (단위: 초) 레코드를 반영할 때 오류가 발생할 경우 재시도 간격을 의미한다. 기본 값: 0 범위: 0 ~ 65535 0: 간격을 두지 않고 즉시 재시도한다. OTHER_DATABASE_ERROR_SKIP_ERROR 레코드를 반영할 때 오류가 발생하여 OTHER_DATABASE_ERROR_RETRY_COUNT 만큼 OTHER_DATABASE_ERROR_RETRY_TIME 간격으로 재시도하였는데도 실패하면, 해당 레코드의 반영을 포기할 것인지 여부를 지정한다. 기본 값: 1 28 Adapter for JDBC User’s Manual 0: Adapter를 종료하면서 에러메시지를 출력한다. (해당 레코드 반영을 포기하지 않는다.) 1: 다음 레코드부터 반영한다. (해당 레코드 반영을 포기한다.) OTHER_DATABASE_SKIP_INSERT Altibase에서 실행된 INSERT 구문을 데이터를 보낼 대상이 되는 Other DB에도 실행할지 여부를 결정하는 프로퍼티이다. 이 프로퍼티를 1로 지정하면 Altibase에서 실행된 INSERT 구문이 Other DB에는 실행되지 않는다 기본 값: 0 0: 구문 실행을 생략하지 않는다. 즉, 정상적으로 구문을 실행한다. 1: 구문 실행을 생략한다. OTHER_DATABASE_SKIP_UPDATE Altibase에서 실행된 UPDATE 구문을 데이터를 보낼 대상이 되는 Other DB에도 실행할지 여부를 결정하는 프로퍼티이다. 이 프로퍼티를 1로 지정하면 Altibase에서 실행된 UPDATE 구문이 Other DB에는 실행되지 않는다. 기본 값: 0 0: 구문 실행을 생략하지 않는다. 즉, 정상적으로 구문을 실행한다. 1: 구문 실행을 생략한다. OTHER_DATABASE_SKIP_DELETE Altibase에서 실행된 DELETE 구문을 데이터를 보낼 대상이 되는 Other DB에도 실행할 지 여부를 결정하는 프로퍼티이다. 이 프로퍼티를 1로 지정하면 Altibase에서 실행된 DELETE 구문이 Other DB에는 실행되지 않는다. 기본 값: 0 0: 구문 실행을 생략하지 않는다. 즉, 정상적으로 구문을 실행한다. 1: 구문 실행을 생략한다. OTHER_DATABASE_SET_USER_TO_TABLE Other DB에 DML 수행시 반영 테이블의 사용자를 XLog Sender에서 지정한 사용자로 설정한다. 설치와 설정 29 기본 값: 0 0: 사용자 지정을 하지 않는다. 1: 사용자 지정을 한다. 프로퍼티 제약조건 프로프티 값을 설정할 때 스페이스 또는 탭을 사용할 수 없다. 또한 특수 문자를 포함한 문자를 함께 사용하기 위해서는 해당 프로퍼티 값을 큰따옴표("")로 처리해야 한다. 사용법 31 3. 사용법 이 장에서는 jdbcAdapter를 구동하고 종료하는 방법과 사용하는 방법을 자세히 설명한다. 32 Adapter for JDBC User’s Manual jdbcAdapter 제약조건 jdbcAdapter를 사용하기 위해서는 여러가지 제약 조건이 있다. 이 조건을 만족하지 않을 경우 jdbcAdapter를 사용할 수 없다. 선행조건 목표 데이터베이스(Other DB)에 입력/수정/삭제 연산시 충돌(Conflict)이 발생하면 연산은 취소되고 설정에 따라 에러 로그 파일에 메시지를 남기거나 무시한다. 복제 도중에 발생한 에러에 대하여 부분 철회할 수 있다. 즉 여러 개의 데이터를 입력 중에 한 개의 중복 데이터가 있으면 중복 데이터만 입력을 취소하고 나머지는 완료된다. 복제 속도는 서비스 속도보다 매우 느릴 수 있다. 데이터 제약조건 복제할 테이블에는 반드시 프라이머리 키가 존재해야 한다. 복제할 테이블의 프라이머리 키에 대한 수정이 없어야 한다. 양쪽 서버의 복제할 테이블은 순서, 프라이머리 키 제약이 동일해야 한다. 연결 제약조건 하나의 Altibase 데이터베이스에 가능한 XLog Sender 및 이중화 연결의 최대 개수는 REPLICATION_MAX_COUNT 프로퍼티에 설정한 값에 의해 결정된다. 허용된 DDL 문 일반적으로 이중화 대상인 테이블은 데이타 정의어(DDL)를 수행할 수 없다. 그러나 다음의 몇 가지 DDL은 xLog Sender와 상관없이 DDL 수행이 가능하다. 그 외 수행할 수 있는 DDL은 Replication Manual의 '이중화 대상 테이블에 DDL 실행'을 참조하기 바란다. ALTER INDEX SET PERSISTENT = ON/OFF 사용법 33 ALTER INDEX REBUILD PARTITION GRANT OBJECT REVOKE OBJECT CREATE TRIGGER DROP TRIGGER 복제 대상 테이블에 허용된 DDL 문 일반적으로 복제 대상 테이블에 데이타 정의어(DDL)를 수행하면, jdbcAdapter는 현재 DDL 이전에 발생한 모든 변경 사항을 대상 데이터베이스에 반영한 후 종료된다. jdbcAdapter가 종료되면, 대상 데이터베이스에 동일한 DDL을 수행하여 테이블 스키마를 동일하게 만든 후 jdbcAdapter를 재시작하여 복제를 다시 할 수 있다. 그 외 수행할 수 있는 DDL은 Replication Manual의 '이중화 대상 테이블에 DDL 실행'을 참조하기 바란다. 34 Adapter for JDBC User’s Manual 구동과 종료 이 절에서는 jdbcAdapter를 구동하고 종료하는 방법을 설명한다. 구동 jdbcAdapter를 구동하는 방법을 단계별로 설명한다. jdbcAdapter를 사용하려면 Altibase와 데이터를 보낼 대상이 되는 Other DB가 먼저 실행중이어야 한다. 또한 Adapter for JDBC 프로퍼티와 환경 변수가 jdbcAdapter실행이 가능한 환경으로 적절히 설정되어 있어야 한다. jdbcAdapter가 구동된 후에 어떤 환경 변수 또는 프로퍼티가 변경된다면, 이 변경을 적용하기 위해서는 jdbcAdapter를 재구동해야 한다. 환경 변수 설정에 대한 자세한 설명은 2장의 “설치 후 작업”을 참고한다. 1. Altibase의 REPLICATION_PORT_NO1 프로퍼티가 실제로 이중화 가능한 포트 번호로 설정되었는지 확인한다. 이 프로퍼티 설정을 바꿀 필요가 있다면, Altibase를 재구동해야 한다. 2. jdbcAdapter를 시작하기 전에, Altibase Log Analyzer (ALA)가 사용될 수 있도록 XLog 송신자를 구성해야 한다. XLog 송신자는 Altibase로부터 XLog와 메타 정보를 송신하는데 사용된다. PROPAGABLE LOGGING을 사용하여 복제한 트랜잭션의 로그를 다른 서버로 전송하기 위해 FOR ANALYSIS PROPAGATION을 사용해야 한다. 다음의 구문은 Altibase 내의 sys 사용자가 소유한 테이블 t1의 데이터를 알티베이스 DB의 user1 사용자가 소유한 테이블 t2로 복제하기 위한 XLog 송신자를 생성한다. CREATE REPLICATION ala FOR ANALYSIS WITH '127.0.0.1', 25090 FROM sys.t1 TO user1.t2; 1 REPLICATION_PORT_NO는 이중화 연결을 위해서 지역 서버에서 사용하는 이중화 포트 번호를 명시한다. 이 프로퍼티에 대한 설명은 Starting Guide를 참고하기 바란다. 사용법 35 3. 이제 jdbcAdapter를 시작한다. jdbcAdapter를 직접 실행할 수도 있고, Adapter for JDBC 유틸리티를 사용해서 실행할 수도 있다. Adapter for JDBC 유틸리티를 사용해서 구동하는 방법은 이 장의 “Adapter for JDBC 유틸리티” 절을 참고한다. LINUX 운영체제에서 아래와 같이 jdbcAdapter를 시작할 수 있다: $ cd $JDBC_ADAPTER_HOME/bin $ ./jdbcAdapter 4. Altibase Log Analyzer를 위한 XLog 송신자를 시작한다. jdbcAdapter를 구동하기 전에 XLog 송신자를 시작하려고 하면 실패할 것이다. iSQL> ALTER REPLICATION ala START; 종료 jdbcAdapter를 종료하는 과정에는 XLog 송신자를 중지하는 과정이 포함된다. jdbcAdapter를 Adapter for JDBC 유틸리티를 사용해서 강제로 종료한다면, 성공적으로 종료는 되겠지만 Altibase 의 XLog 송신자는 jdbcAdapter와의 접속을 계속 시도할 것이다. iSQL> ALTER REPLICATION ala STOP; Alter success. 36 Adapter for JDBC User’s Manual 데이터 타입 Altibase의 데이터가 OTHER DATABASE에 JDBC를 이용하여 적용될 때, JAVA의 String형으로 변환 하여 적용된다. 단, DATE 타입은 JAVA의 Timestamp형으로 변환 되어 적용 된다. 지원하는 데이터 타입은 FLOAT, NUMERIC, DOUBLE, REAL, BIGINT, INTEGER, SMALLINT, DATE, CHAR, VARCHAR, NCHAR, NVARCHAR이다. 사용법 37 Adapter for JDBC 유틸리티 Adapter for JDBC 유틸리티 (oaUtility)는 jdbcAdapter를 데몬으로 실행하고 이의 상태를 체크하는 스크립트이다. 이 스크립트는 GNU sed가 설치된 bash 쉘에서 실행된다. Other Database에 대한 Constraints는 체크하지 않는다. Adapter for JDBC 유틸리티가 지원하는 옵션은 다음과 같다. oaUtility start oaUtility stop oaUtility status oaUtility check oaUtility start 구문 oaUtility {start} 설명 jdbcAdapter를 데몬으로 실행한다. oaUtility stop 구문 oaUtility {stop} 설명 실행중인 jdbcAdapter프로세스를 강제 종료한다. oaUtility status 구문 38 Adapter for JDBC User’s Manual oaUtility {status} 설명 jdbcAdapter가 동작 중인지 확인한다. oaUtility check 구문 oaUtility { check [ alive ] } 설명 jdbcAdapter가 동작 중인지 계속 확인하다가, oaUtility가 종료되면 (정상 종료 또는 강제 종료 여부에 상관없이) 재시작한다. alive 옵션을 지정하면 jdbcAdapter가 동작 중인지를 한 번만 확인하고 oaUtility는 종료된다. 사용법 39 커맨드 라인 옵션 jdbcAdapter는 아래의 커맨드 라인 옵션을 제공한다. 구문 jdbcAdapter [ -v | -version ] 설명 이 옵션은 jdbcAdapter가 Altibase의 어떤 버전과 함께 컴파일 되었는지를 알려준다. 예제 $./jdbcAdapter -v Adapter for JDBC version 7.1.0.0.2 ... 부록A. FAQ 41 A. 부록: FAQ 42 Adapter for JDBC User’s Manual FAQ 환경 변수 혹은 프로퍼티 변경 후에 어떻게 해야 하나요? jdbcAdapter가 구동된 후에 환경 변수나 프로퍼티를 변경하면, 변경 사항을 적용하기 위해서는 jdbcAdapter를 재시작해야 합니다. 만약에 알티베이스 DB에 데이터가 제대로 반영되지 않으면 어떻게 됩니까? jdbcAdapter가 알티베이스 DB에 데이터를 쓰는 데 실패하면, 로그 메시지만 남기고 다음 데이터 반영을 계속합니다. 로그 메시지는 $JDBC_ADAPTER_HOME/trc 디렉터리의 트레이스 로그 파일에 기록됩니다. 부록B. jdbcAdapter 사용시 DDL 수행 순서 43 B. 부록: jdbcAdapter 사용시 DDL 수행 순서 44 Adapter for JDBC User’s Manual jdbcAdapter 사용시 DDL 수행 순서 jdbcAdapter를 사용할 때 이중화를 수행중인 DDL은 아래의 순서대로 수행해야 한다. N o Active Server jdbcAdapter Standby Server 1.양쪽 서버에 스키마 생성 CREATE TABLE T1 ( C1 INTEGER PRIMARY KEY, C2 SMALLINT ); CREATE TABLE T1 ( C1 INTEGER PRIMARY KEY, C2 SMALLINT ); 2.ANALYSIS로 이중화 생성 CREATE REPLICATION ala FOR ANALYSIS WITH 'Standby IP', Standby Port FROM SYS.T1 TO SYS T1; 3.jdbcAdapter 시작 $ oaUtility start 4.이중화 시작 ALTER REPLICATION ala START; 5.이중화 Gap 제거를 위해 Flush 구문 수행 ALTER REPLICATION ALA FLUSH ALL; 6.DDL 수행을 위한 이중화 관련 프로퍼티 값 설정 ALTER SYSTEM SET REPLICATION_DDL_ENA BLE = 1; ALTER SYSTEM SET REPLICATION_DDL_ENA BLE_LEVEL = 1; 7. Active 서버에 DDL 수행 Adapter 종료 (DDL 로그 처리로 인하여) 8.jdbcAdapter trc 로그 확인 SELECT REP_NAME, STATUS FROM V$REPSENDER; 조회하여 STATUS 가 2 확인 'Log Record : Meta change xlog was arrived, adapter will be finished' trc 로그 메시지 확인 9.Standby 서버에 DDL 수행 DDL 10.jdbcAdapt er 재실행 $ oaUtility start 11.이중화 중지 및 재시작 (생략가능) (optional) ALTER REPLICATION ALA STOP; ALTER REPLICATION ALA START; 부록B. jdbcAdapter 사용시 DDL 수행 순서 45 N o Active Server jdbcAdapter Standby Server 12.데이터 복제 여부 확인 DML (Service) 데이터 복제 확인 13.DDL 중지를 위한 이중화 관련 프로퍼티 값 설정 ALTER SYSTEM SET REPLICATION_DDL_ENA BLE = 0; ALTER SYSTEM SET REPLICATION_DDL_ENA BLE_LEVEL = 0; 찾아보기 47 찾아보기 A Adapter for JDBC ................................. 12 Adapter for JDBC 유틸리티 ................... 37 Adapter for JDBC의 구조 ...................... 13 ADAPTER_ERROR_RESTART_COUNT ... 25 ADAPTER_ERROR_RESTART_INTERVAL 25 ALA..................................................... 12 ALA 프로퍼티 ....................................... 23 ALA_LOGGING_ACTIVE ................. 19, 24 ALA_RECEIVE_XLOG_TIMEOUT ........... 24 ALA_RECEIVER_PORT .................... 18, 23 ALA_REPLICATION_NAME ............. 19, 24 ALA_SENDER_IP ............................ 18, 23 ALA_SENDER_REPLICATION_PORT ...... 23 ALA_SOCKET_TYPE ....................... 19, 24 ALA_XLOG_POOL_SIZE ................. 19, 24 ALTIBASE_IP .................................. 19, 25 ALTIBASE_NLS_USE ....................... 21, 22 ALTIBASE_PASSWORD .................. 19, 25 ALTIBASE_PORT ............................ 19, 25 ALTIBASE_USER ............................ 19, 25 B bin 디렉터리 ........................................ 21 C CLASSPATH ......................................... 17 conf 디렉터리 ...................................... 21 D DML 관련 프로퍼티 .............................. 26 G GNU sed ............................................. 37 H Handshaking ....................................... 14 J JAVA_HOME ....................................... 17 JDBC_ADAPTER_HOME ........... 20, 21, 22 jdbcAdapter ........................................ 12 jdbcAdapter 선행조건........................... 32 jdbcAdapter 설치 ................................. 18 jdbcAdapter 인스톨러의 명명 규칙 ........ 18 jdbcAdapter 제약조건........................... 32 JRE ...................................................... 17 L Log Analysis API ................................... 14 M msg 디렉터리 ....................................... 21 O oaUtility ............................................... 37 oaUtility check ..................................... 38 oaUtility start ....................................... 37 oaUtility status ..................................... 37 oaUtility stop ....................................... 37 OTHER_DATABASE_BATCH_DML_MAX_S IZE ................................................... 27 OTHER_DATABASE_GROUP_COMMIT 20, 26 OTHER_DATABASE_PASSWORD .... 19, 26 OTHER_DATABASE_SET_USER_TO_TABLE ....................................................... 28 OTHER_DATABASE_SKIP_DELETE .. 19, 28 OTHER_DATABASE_SKIP_INSERT ... 19, 28 OTHER_DATABASE_SKIP_UPDATE . 19, 28 OTHER_DATABASE_USER .............. 19, 26 P PATH ................................................... 20 48 Adapter for JDBC User’s Manual T trc 디렉터리 ......................................... 21 X XLog ................................................... 14 XLog 송신자 ......................................... 14 XLog 콜렉터 ......................................... 14 ㄱ 구동 ..................................................... 34 국가 문자집합 ....................................... 16 ㄷ 데이터 제약조건 .................................... 32 데이터베이스 문자집합 ........................... 16 데이터베이스 버전 ................................. 16 ㅅ 설정 ..................................................... 22 설치 ..................................................... 18 설치 후 작업 ......................................... 21 ㅇ 연결 제약조건 ....................................... 32 외부 데이타베이스의 프로퍼티 ................ 26 ㅈ 제약조건
- [Altibase 7.1] Adapter for JDBC User's Manual
Release Note
-
- Altibase Plugin for SQuirreL SQL Client v.1.0 Release Notes (English)
ㅣ 2017-12-04
- JDBC driver. The minimum version of Java supported is 1.6.x for SQuirreL SQL Client 3.x version. Altibase JDBC driver is a pure Java-based software component (Type-4) enabling a Java application to interact with Altibase DBMS and requires JRE vers...
-
미리보기
Altibase Plugin for SQuirreL SQL Client 1.0 Release Notes September 15, 2017 Altibase Plugin for SQuirreL SQL Client 1.0 Release Notes 2 / 7 Table of Contents 1. Abstract ................................................................................................................................. 3 1.1 System Requirements ....................................................................................... 3 1.2 Supported Operating Systems and Platforms ......................................... 3 2. Release Information ...................................................................................................... 4 2.1 Altibase Plugin for SQuirreL SQL Client ..................................................... 4 2.2 Changes .................................................................................................................. 5 2.3 Open Source Libraries / Royalty-Free Images Used ............................ 6 2.4 Packages ................................................................................................................ 7 2.5 Downloads .............................................................................................................. 7 Altibase Plugin for SQuirreL SQL Client 1.0 Release Notes 3 / 7 1. Abstract 1. 1 S y stem R eq u i r emen ts Minimum Hardware Computer processor: 800MHz Pentium III or better Computer memory: 512MB or more Computer disk: 100MB or more free space Screen resolution: 1024 x 768 pixels or greater 1.2 Supported Operating Systems and Platforms Java Runtime Environment OS Graphic Library Sun or IBM Java 1.6 or higher Required (Java Swing) The Java Runtime Environment (JRE) version 1.6 or higher and additional support for the graphic library of operating system are required in order to execute Altibase Plugin for SQuirreL SQL Client at client computer. SQuirreL SQL Client application is a pure Java-based graphical program to allow users to explore and interact with database via a JDBC driver. The minimum version of Java supported is 1.6.x for SQuirreL SQL Client 3.x version. Altibase JDBC driver is a pure Java-based software component (Type-4) enabling a Java application to interact with Altibase DBMS and requires JRE version 1.5 or higher. Altibase Plugin for SQuirreL SQL Client is a plug-in application written in Java that runs within SQuirreL and works with Altibase JDBC driver. Therefore, SQuirreL SQL Client, Altibase Plugin, and Altibase JDBC driver rely on the Java Runtime Environment (JRE) instead of the client's hardware or an operating system. Altibase Plugin for SQuirreL SQL Client 1.0 Release Notes 4 / 7 2. Release Information 2. 1 A l ti b ase Pl u g i n fo r SQu i r r eL SQ L C l i en t 1 . 0 SQuirreL SQL Client is a graphical Java program that will allow user to view the structure of a JDBC compliant database, browse the data in tables, and issue SQL commands etc. Altibase Plugin for SQuirreL SQL Client is a database plug-in for SQuirreL SQL Client to handle Altibase specific database objects in the object tree and SQL grammar in the SQL editor. 2.1.1 New Features Provides Altibase specific database objects in the object tree. Lists table-dependent objects (constraint, index and trigger) as children of a table in the object tree. Shows detail information on database objects such as index, sequence, constraint and so on. Shows source code of database objects such as stored procedure, function, package, typeset, trigger, library, synonym, view and materialized view. Supports Altibase Persistent Stored Module (PSM) DDL grammar at SQL editor. Altibase Plugin for SQuirreL SQL Client 1.0 Release Notes 5 / 7 2.2 Changes Features that have been added, deleted or updated in Altibase Plugin for SQuirreL SQL Client are listed and explained below. 2.2.1 Version Update Altibase Plugin for SQuirreL SQL Client Version Altibase Plugin for SQuirreL SQL Client 1.0 2.2.2 Version Compatibility SQuirreL SQL Client : 3.7.1 or 3.8.0 Altibase database : 6.5.1. or higher 2.2.3 Properties NONE 2.2.4 Error Messages NONE Altibase Plugin for SQuirreL SQL Client 1.0 Release Notes 6 / 7 2.3 Open Source Libraries / Royalty-Free Images Used Altibase Plugin for SQuirreL SQL Client is based on the following open-source libraries. Library Open Source License SQuirreL SQL Client GNU Library or Lesser General Public License version 2.0 (LGPLv2) GNU General Public License version 2.0 (GPLv2) Altibase Plugin for SQuirreL SQL Client 1.0 Release Notes 7 / 7 2.4 Packages altibase4squirrel1.0.zip 2.5 Downloads 2.5.1 Location Packages http://support.altibase.com/kr/product Manual http://support.altibase.com/kr/manual 2.5.2 Installation Please refer to the Altibase Plugin for SQuirreL SQL Client User's Guide.
- Altibase Plugin for SQuirreL SQL Client v.1.0 Release Notes (English)
-
- Altibase (ver 7.1.0.0.0) Release Notes (English)
ㅣ 2017-07-06
- JDBC Logging JDBC Logging indicates recording of all sorts of logs occurring in the Altibase JDBC driver, and the relevant logs can be stored by using java.util.logging package. 2.1.1.3 Data Types Support for Date format Altibase supports 'WW2'...
-
미리보기
Altibase 7.1.0.0.0 Release Notes (2016.11) Altibase 7.1.0.0.0 Release Notes Altibase Contents Contents .................................................................................................................... 2 1. Operating System Requirements ........................................................... 3 Minimum Hardware Specifications ................................................ 4 Operating System and Platforms .................................................. 4 2. Release Information ..................................................................................... 5 2.1 New Features and Upgraded function of Altibase 7.1 ............ 6 2.2 Changes ................................................................................ 13 2.3 Packages .............................................................................. 16 2.4 Downloads ............................................................................ 17 Altibase 7.1.0.0.0 Release Notes Altibase 1. Operating System Requirements Altibase 7.1.0.0.0 Release Notes Altibase Minimum Hardware Specifications 1GB RAM (Recommended: 2GB) 1 CPU (Recommended: 2 CPUs) 4GB Sufficient space in hard disk (Recommended: 12GB) Operating System and Platforms Altibase 7.1 operation is available under the operating systems and platforms listed in the following table. OS CPU Version Bit (Server) Bit (Client) AIX PowerPC 6.1 tl03 and higher 64-bit 64-bit HP-UX IA64 11.31 and higher 64-bit 64-bit LINUX x86-64, PowerPC (GNU glibc 2.12 and higher) redhat 6.0 and higher 64-bit 64-bit Java version: Altibase 7.1 is compatible with JDK 1.5 or above. Window server and client is not supported since Altibase 7.1. Altibase 7.1.0.0.0 Release Notes Altibase 2. Release Information Altibase 7.1.0.0.0 Release Notes Altibase 2.1 New Features and Upgraded function of Altibase 7.1 2.1.1 Improved Features 2.1.1.1 SQL Extension Conversion of Non-Partitioned table and Partitioned table(Partition Exchange) CONJOIN TABLE: This statement controls converting a non-partitioned table into a partition of a table. The list partition and range partition are supported, but the hash partitioned is not supported. All the data created in the target table is transferred to the created partition. DISJOIN TABLE: You can use this statement to convert a partition in a partitioned table into a non- partitioned table. The hash partition is not supported whereas the existing partition attributes of the non-partitioned table remain the same. Modifying Tablespace of Table The tablespace storage of a table can be relocated along with the index and LOB column as well. However, only the non-partitioned table is able to transfer the records into the specified tablespace, but the records of the partitioned table cannot be moved. User-defined Columns during Creation of a Queue The user can define a column when creating a queue. Syntax extension of COMPACT and AGING COMPACT and AGING statements can be executed with a partition unit in partitioned tables. NOWAIT and WAIT Options NOWAIT and WAIT options are supported in INSERT, FOR UPDATE, and DEQUEUE statements. NOCOPY option The NOCOPY option can be employed along with parameters and local variables which are used in the stored procedures and the stored functions. This option takes a way of assigning parameters by utilizing the reference value, and only supports ASSOCIATIVE ARRAY type. Overloading of Package Subprogram Overloading of subprograms is available. That is to say, the name of subprograms are the same; however, the name of parameter and data type can be diversely defined. Using BULK COLLECTION in FETCH syntax BULK COLLECT INTO function is supported in the FETCH statement. Static SQL available for using Cursor Not only the dynamic SQL is available, but also the static SQL is available for use in the OPEN FOR clause. Note that the static SQL cannot be executed with the USING clause. Altibase 7.1.0.0.0 Release Notes Altibase Autonomous Transation and Exception Initializing Pragmas Altibase supports the following pragmas specifying compile options. Autonomous transaction pragma allows a PSM object to independently operate within a transaction, and there is an exception initializing pragma which can initialize exception variables with Altibase error code. Aggregate functions and Windows functions Various functions such as, percentage rank, ratio analysis functions, cumulative distribution of a group, array functions, sort functions, coefficient of correlation, sample covariance, and population distribution are supported in the aggregate functions and window functions as below. PERCENT_RANK CUME_DIST RATIO_TO_REPORT NTILE CORR COVAR_SAMP COVAR_POP User Lock functions The following functions are supported in an attempt to request or release the user lock. USER_LOCK_REQUEST USER_LOCK_RELEASE Other functions The following function which returns the context of currently accessed environment is supported. SYS_CONTEXT The functions returning the VARBYTE type character strings through encoding or decoding are supported as follows: BASE64_DECODE BASE64_ENCODE Altibase supports functions which can return VARBAYTE type character strings either by decoding or encoding the VARBYTE type character strings which were converted to Quoted printable format. The functions include as follows: QUOTE_PRINTABLE_DECODE QUOTE_PRINTABLE_ENCODE In addition, exclusive functions based upon the Altibase PIPE method have been added. These functions can efficiently manage overall database not belonging to a specific schema as listed below: MSG_CREATE_QUEUE MSG_DROP_QUEUE MSG_SND_QUEUE MSG_RCV_QUEUE Altibase 7.1.0.0.0 Release Notes Altibase 'UNTIL NEXT DDL' in LOCK TABLE If DDL(Data Definition Language) transaction is executed when a session is on NON- AUTOCOMMIT mode, the autocommit is executed before the DDL execution. However, if EXCLUSIVE mode is specified in the lock_mode, the autocommit is not implemented before the DDL execution. ENABLE and DISABLE functions The user can set the status either to enable or disable when creating triggers, and the ALTER TRIGGER statement can modify the status. 2.1.1.2 Application Interface Improvement JDBC Logging JDBC Logging indicates recording of all sorts of logs occurring in the Altibase JDBC driver, and the relevant logs can be stored by using java.util.logging package. 2.1.1.3 Data Types Support for Date format Altibase supports 'WW2' data format that returns which week of the year regardless of the date. 2.1.1.4 Built-in Functions DBMS Stats Functions The built-in function has been added in this release, and this function can duplicate partition stats. COPY_TABLE_STATS Other Built-in Functions The stored procedures, which can store the setting of V$SESSION information have been added as in the followings: SET_CLIENT_INFO SET_MODULE 2.1.1.5 Client Tools Improved altimon.sh The altimon.sh has been enhanced in order to efficiently monitor the Altibase server and the host system in which the altiMon is installed. altiMon primarily monitors OS information and DB information, and the OS which can use the PICL library is required to collect the OS information. Host Variable The default value of declared host variables has been modified. New ISQL command A command configuring the formatted display for the result of a SELECT column in the iSQL prompt has been added. Altibase 7.1.0.0.0 Release Notes Altibase SET NUMF[ORMAT] COLUMN CL[EAR] COL[UMNS] -prefetch_rows otpion of iLoader utility iLoader utility newly support -prefetch_rows option in the out mode of iLoader. This specify the number of records that can be fetched from the database at once. The default value is 0 which is the maximum size where the network packet can be input. Partition Information Output The DESC command allows to view partition information when viewing the table structure. aexport Property The following properties of aexport utility have been added. ILOADER_ARRAY ILOADER_COMMIT ILOADER_ERRORS ILOADER_PARALLEL 2.1.2 Efficiency 2.1.2.1 Enhanced Server Performance Newly Added Packages The system-defined stored packages newly added in Altibase are as follows. DBMS_ALERT DBMS_APPLICATION_INFO DBMS_CONCURRENT_EXEC DBMS_LOCK DBMS_OUPUT DBMS_RANDOM DBMS_SQL DBMS_STATS DBMS_RECYCLEBIN DBMS_UTILITY UTL_FILE UTL_RAW UTL_TCP Result Cache By using the Result Cache, the intermediate result or the final result of initially executed query can be stored so that the results can be reused when executing the same query again. Two-Phase Commit(2PC)Level of DBLink DB Link provides 2PC protocol to ensure interoperable compatibility of the global transaction conducted between other database system and the Altibase. Altibase 7.1.0.0.0 Release Notes Altibase Collecting of Automatic Statistics Columns that are not referenced from the outside are excluded to reduce the size and accelerate the performance of materialized views. Additional Hints In Altibase 7.1, various and advantageous hints, such as normalization code, join methods, and table access methods as well as parallel query execution have been added. INDEX_ASC INDEX_DESC LEADING NO_EXPAND NO_INDEX NO_PARALLEL NO_USE_HASH NO_USE_MERGE NO_USE_NL NO_USE_SORT USE_CONCAT Delay on Execution Plans A function delaying execution of hierarchy, sorting, windowing, grouping, set, and distinction in fetch is provided based upon execution plan graphs. The user can check the added DELAY plan under the top PROJECTION in the execution plan. IPCDA Protocol IPCDA (Inter Process Communication Direct Attach) is a protocol provided by Altibase to exchange data between the server and client by using shared memory as with IPC. IPCDA can produce much advanced performance by reducing idle time between the server and client as well as simplifying data reading and writing compared to IPC. Like as IPC, CLI and OBDB are supported, but JDBC is not supported. Besides, LOB data cannot be used when using IPCDA. IPCDA is only supported on Linux. The following properties should be configured in order to use IPCDA. ACCESS LIST Management Extension The following ACCESS_LIST_FILE property has been added to allow or deny access of the IP packet described in an external file. ACCESS_LIST_FILE 2.1.2.2 Resource Efficiency Reorganization of Memory Index You can reorganize the index space through integration of leaf nodes in the memory index. This function ensures high space efficiency especially when the index range is relatively greater than that of the data, or there is an occurrence of index fragmentation on a particular index. Altibase 7.1.0.0.0 Release Notes Altibase 2.1.3 High Availability Hybrid Partitioned Table Hybrid partitioned tables are supported in Altibase 7.1, and the partitioned table can transfer data from disk tablespace to memory/volatile tablespace, and vice versa; however, global indexes are not supported. Specifying the size of PSM character data Properties that can determine the size of character data type used in the stored procedures and the stored functions have been added as indicated below. PSM_CHAR_DEFAULT_PRECISION PSM_NCHAR_UTF8_DEFAULT_PRECISION PSM_NCHAR_UTF16_DEFAULT_PRECISION PSM_NVARCHAR_UTF8_DEFAULT_PRECISION PSM_NVARCHAR_UTF16_DEFAULT_PRECISION PSM_PARAM_AND_RETURN_WITHOUT_PRECISION_ENABLE PSM_VARCHAR_DEFAULT_PRECISION The properties specifying the basic size of character type data have been removed as follows. CHAR_DEFAULT_PRECISION NCHAR_DEFAULT_PRECISION NVARCHAR_DEFAULT_PRECISION VARCHAR_DEFAULT_PRECISION REMOTE Functions for Batch Process Altibase 7.1 have included Remote function and the related functions that can batch the database links.The added functions can be used only within the stored procedures. JDBC Adapter JDBC Adapter is an utility which applies modified data in Altibase database to other databases which support JDBC. The structure of this utility is to replicate the modified data to the target database through ALA(Alibase Log Analysis API) and JDBC(Java DataBase Connectivity). As of now, JDBC Adapter is only supported in Linux OS and operates in JRE 7 or higher version. 2.1.4 Other 2.1.4.1 Other Changes Deprecation of Supporting Window Platform Window server and client is not supported since Altibase 7.1. Table Function The TABLE FUNCTION transforms the return values of associative array type or the record type variables into a table form, then output them; however, this is not a function Dynamic SQL Method 4 Method 4 has been added in dynamic SQL. This method allows a user to insert values of parameter Altibase 7.1.0.0.0 Release Notes Altibase markers during the program operation. Functions, such as BIND VARIABLES, SELECT LIST, and ARRAY SIZE SET have been added in Altibase 7.1, and OPEN, FETCH, and EXECUTE functions have been highly improved. Support for JRE 1.5 JDK and JRE 1.5 or above is supported. Elimination of DataPort Data transferring function of DataPort, and convdp utility are no longer supported since they have been eliminated. Support Hibernate Hibernate dialect class is supported for Altibase to provide non-standard SQL. Since the official Hibernate library does not include AltibaseDialect.class, AltibaseDialect.java file should be compiled and ported in order to properly use it. Deprecation of Shared Memory mode Shared memory mode is no longer supported since Altibase version 7.1. The management tool supporting shared memory 'shmutil' and the following properties are not available for use anymore. The management tool supporting shared memory 'shmutil' and properties are not available for use anymore. 2.2 Changes The added, modified, and eliminated functions for database administrators and developers to be informed are explicated in the following sections. Database Versions Database components per the latest version. Altibase Version Database Binary Version Communication protocol Version Meta Version Replication Protocol Version 6.5.1 6.3.1 7.1.3 8.1.1 7.4.2 7.1 6.5.1 7.1.3 8.1.1 7.4.2 Compatibility Database Binary Version The database binary version signifies the compatibility between database image file and log files. Since the format of database image file and log file have been changed, the existing database should be migrated when upgrading the database. Altibase Version Database Binary Version 6.5.1 6.3.1. 7.1 6.5.1 Communication Protocol Version The communication Protocol Version remains the same Altibase Version Communication Protocol Version 6.5.1 7.1.3 7.1 7.1.3 Meta Version The Meta Version has not been changed. Altibase Version Meta Version 6.5.1 8.1.1 7.1 8.1.1 Altibase 7.1.0.0.0 Release Notes Altibase Replication Protocol Version The replication between Altibase 6.5.1 and 7.1 can be performed since the protocol version has not been changed. Altibase Version Replication Protocol Version 6.5.1 7.4.2 7.1 7.4.2 Properties The following properties have been included or eliminated. Refer to the General Reference for in-depth information on each property New Properties in Altibase 7.1 ACCESS_LIST_FILE DBLINK_RECOVERY_MAX_LOGFILE IPCDA_CHANNEL_COUNT IPCDA_DATABLOCK_SIZE IPCDA_FILEPATH LOCK_MGR_CACHE_NODE LOCK_MGR_DETECTDEADLOCK_INTERVAL LOCK_MGR_MAX_SLEEP LOCK_MGR_MIN_SLEEP LOCK_MGR_SPIN_COUNT LOCK_MGR_TYPE LOCK_NODE_CACHE_COUNT MEM_INDEX_KEY_REDISTRIBUTION MEM_INDEX_KEY_REDISTRIBUTION_STANDARD_RATE MSG_QUEUE_PERMISSION OPTIMIZER_AUTO_STATS OPTIMIZER_DELAYED_EXECUTION OPTIMIZER_PERFORMANCE_VIEW PSM_CURSOR_OPEN_LIMIT PSM_CHAR_DEFAULT_PRECISION PSM_NCHAR_UTF8_DEFAULT_PRECISION PSM_NCHAR_UTF16_DEFAULT_PRECISION PSM_NVARCHAR_UTF8_DEFAULT_PRECISION PSM_NVARCHAR_UTF16_DEFAULT_PRECISION PSM_PARAM_AND_RETURN_WITHOUT_PRECISION_ENABLE PSM_VARCHAR_DEFAULT_PRECISION RESULT_CACHE_ENABLE RESULT_CACHE_MEMORY_MAXIMUM TABLE_LOCK_MODE TOP_RESULT_CACHE_MODE Altibase 7.1.0.0.0 Release Notes Altibase USER_LOCK_POOL_INIT_SIZE USER_LOCK_REQUEST_CHECK_INTERVAL USER_LOCK_REQUEST_LIMIT USER_LOCK_REQUEST_TIMEOUT The following property has been eliminated. CHAR_DEFAULT_PRECISION DATAPORT_FILE_DIRECTORY DATAPORT_IMPORT_COMMIT_UNIT DATAPORT_IMPORT_STATEMENT_UNIT IPC_PORT_NO NCHAR_DEFAULT_PRECISION NVARCHAR_DEFAULT_PRECISION SHM_DB_KEY SHM_PAGE_COUNT_PER_KEY STARTUP_SHM_CHUNK_SIZE VARCHAR_DEFAULT_PRECISION Meta Tables The following meta table has been eliminated. SYS_DATA_PORTS_ Performance Views The following performance views have been added. V$ACCESS_LIST V$DBLINK_NOTIFIER_TRANSACTION_INFO The following performance views have been altered. V$DBLINK_LINKER_DATA_SESSION_INFO V$DBLINK_GLOBAL_TRANSACTION_INFO V$DBLINK_REMOTE_STATEMENT_INFO V$DBLINK_REMOTE_TRANSACTION_INFO V$SESSION V$REPSENDER V$REPSENDER_PARALLEL 2.3 Packages OS CPU Archive Name AIX PowerPC altibase- server-7.1.0.0.0-AIX-POWERPC-64bit-release.run altibase- client-7.1.0.0.0-AIX-POWERPC-64bit-release.run HP-UX IA64 altibase- server-7.1.0.0.0-HPUX-IA64-64bit-release.run altibase- client -7.1.0.0.0-HPUX-IA64-64bit-release.run LINUX X86 altibase- server-7.1.0.0.0-LINUX-X86-64bit-release.run altibase- client-7.1.0.0.0-LINUX-X86-64bit-release.run PowerPC altibase- server-7.1.0.0.0-LINUX-POWERPC-64bit-release.run altibase- client-7.1.0.0.0-LINUX-POWERPC-64bit-release.run 2.4 Downloads Location Package http://support.altibase.com Manual http://support.altibase.com Installation Refer to the Altibase Installation Guide for in-depth information.
- Altibase (ver 7.1.0.0.0) Release Notes (English)
Patch Note
-
- ALTIBASE HDB v.6.3.1.4.1 Patch Notes (Korean)
ㅣ 2015-05-21
- ALTIBASE HDB 6.3.1.4.1 Patch Notes ALTIBASE HDB Patch Notes 6.3.1.4.1 2/7 Table of Contents BUG-40158 JDBC에서 데이터 사이즈가 32000 byte보다 크면, 데이터를 정상적으로 가져오지 못할 수 있다. 3 BUG-40916 defunct...
-
미리보기
ALTIBASE HDB 6.3.1.4.1 Patch Notes ALTIBASE HDB Patch Notes 6.3.1.4.1 2/7 Table of Contents BUG-40158 JDBC에서 데이터 사이즈가 32000 byte보다 크면, 데이터를 정상적으로 가져오지 못할 수 있다. 3 BUG-40916 defunct process 가 증가할 수 있다. 3 BUG-40939 APRE의 DECLARE CURSOR 에서 cursor이름이 SELECT_CUR일 경우 query string 값이 제대로 입력되지 되지 않는다. 3 BUG-40980 TABLESPACE를 생성(AUTOEXTEND OFF)하여 사용중 TABLESPACE의 MAX에 도달하면 에러메시지를 로그에 기록한다. 4 BUG-40992 FUNCTION(_PROWID)를 사용할 경우 서버가 비정상 종료할 수 있다. 5 BUG-41013 Windowing function과 _PROWID를 함께 사용할 수 없다. 5 BUG-41018 subquery unnesting 사용할 경우 결과가 틀릴 수 있다. 5 BUG-41025 IN 연산자를 사용할 때 서버가 비정상 종료할 수 있다. 6 BUG-41047 DISTINCT 사용시에 서버가 비정상 종료할 수 있다. 6 BUG-41063 Oracle NUMBER 타입은 DB Link 기능에서 오동작할 수 있다. 6 BUG-41067 DB Link 기능을 사용 중에 네트워크 단절 등의 예외 상황이 발생할 때 서버가 종료한다. 6 BUG-41073 Grouping sets 사용 시에 틀린 에러 메시지가 출력될 수 있다. 7 ALTIBASE HDB Patch Notes 6.3.1.4.1 3/7 BUG-40158 JDBC에서 데이터 사이즈가 32000 byte보다 크면, 데이터를 정상적으로 가져오지 못할 수 있다. - Module: mm-jdbc - Category: Functional Error - Reproducibility: Always - Reproducing Conditions: NONE - Symptoms: JDBC에서 데이터 사이즈가 32000 byte보다 크면, 데이터를 정상적으로 가져오지 못할 수 있다. - Changes: NONE - Workaround: NONE BUG-40916 defunct process 가 증가할 수 있다. - Module: qp-psm-trigger-execute - Category: Functional Error - Reproducibility: Frequence - Reproducing Conditions: NONE - Symptoms: defunct된 process 증가할 수 있다. - Changes: NONE - Workaround: NONE BUG-40939 APRE의 DECLARE CURSOR 에서 cursor이름이 SELECT_CUR일 경우 query string 값이 제대로 입력되지 되지 않는다. ALTIBASE HDB Patch Notes 6.3.1.4.1 4/7 - Module: mm-apre - Category: Usability - Reproducibility: Always - Reproducing Conditions: 재현 struct ulpSqlstmt ulpSqlstmt; memset( , 0, sizeof(ulpSqlstmt)); ulpSqlstmt.stmttype = 12; ulpSqlstmt.stmtname = NULL; ulpSqlstmt.curname = (char*) "SELECT_CUR"; ulpSqlstmt.ismt = 0; ulpSqlstmt.numofhostvar = 0; ulpSqlstmt.statusptr = NULL; ulpSqlstmt.errcodeptr = NULL; ulpSqlstmt.isatomic = 0; ulpSqlstmt.stmt = (char *)"SELECT_CUR CURSOR FOR SELECT * FROM DEPARTMENTS"; ulpSqlstmt.iters = 0; ulpSqlstmt.sqlinfo = 0; ulpSqlstmt.scrollcur = 0; ulpSqlstmt.cursorscrollable = 0; ulpSqlstmt.cursorsensitivity = 1; ulpSqlstmt.cursorwithhold = 0; ulpSqlstmt.esqlopts = _esqlopts; ulpSqlstmt.sqlcaerr = ulpSqlstmt.sqlcodeerr = ulpSqlstmt.sqlstateerr = ulpGetSqlstate(); ulpDoEmsql( NULL, , NULL ); 실제 결과 sqlcode : -1 SQLSTATE : 42000 sqlerrmc : Invalid statement processing request 예상 결과 not print error - - Symptoms: APRE의 DECLARE CURSOR 에서 cursor이름이 SELECT_CUR일 경우 query string 값이 제대로 입력되지 되지 않는다. - Changes: NONE - Workaround: DECLARE CURSOR 정의시에cursor이름에 “SELECT_CUR” 가 포함되지 않도록 한다. BUG-40980 TABLESPACE를 생성(AUTOEXTEND OFF)하여 사용중 TABLESPACE의 MAX에 도달하면 에러메시지를 로그에 기록한다. ALTIBASE HDB Patch Notes 6.3.1.4.1 5/7 - Module: sm - Category: Maintainability - Reproducibility: Always - Reproducing Conditions: NONE - Symptoms: 사용자가 AUTOEXTEND OFF 모드로 테이블스페이스를 사용할 때 테이블스페이스의 크기가 최대 크기에 도달하면, 에러메시지를 로그에 기록한다. "Unable to extend the tablespace(tbs_name) when AUTOEXTEND mode is OFF" - Changes: NONE - Workaround: NONE BUG-40992 FUNCTION(_PROWID)를 사용할 경우 서버가 비정상 종료할 수 있다. - Module: qp-select-pvo - Category: Fatal - Reproducibility: Always - Reproducing Conditions: NONE - Symptoms: function(_prowid)를 사용할 경우 서버가 비정상 종료할 수 있다. - Changes: NONE - Workaround: NONE BUG-41013 Windowing function과 _PROWID를 함께 사용할 수 없다. - Module: qp-select-pvo - Category: Fatal - Reproducibility: Always - Reproducing Conditions: NONE - Symptoms: Windowing function과 _PROWID를 함께 사용할 수 없다. - Changes: NONE - Workaround: NONE BUG-41018 subquery unnesting 사용할 경우 결과가 틀릴 수 있다. ALTIBASE HDB Patch Notes 6.3.1.4.1 6/7 - Module: qp - Category: Functional Error - Reproducibility: Always - Reproducing Conditions: NONE - Symptoms: subquery unnesting 사용할 경우 결과가 틀릴 수 있다. - Changes: NONE - Workaround: NONE BUG-41025 IN 연산자를 사용할 때 서버가 비정상 종료할 수 있다. - Module: qp - Category: Fatal - Reproducibility: Always - Reproducing Conditions: NONE - Symptoms: IN 연산자를 사용할 때 서버가 비정상 종료할 수 있다. - Changes: NONE - Workaround: NONE BUG-41047 DISTINCT 사용시에 서버가 비정상 종료할 수 있다. - Module: qp-select-pvo - Category: Fatal - Reproducibility: Always - Reproducing Conditions: NONE - Symptoms: DISTINCT 사용시에 서버가 비정상 종료할 수 있다. - Changes: NONE - Workaround: NONE BUG-41063 Oracle NUMBER 타입은 DB Link 기능에서 오동작할 수 있다. - Module: dblink - Category: Functional Error - Reproducibility: Always - Reproducing Conditions: NONE - Symptoms: Oracle NUMBER 타입은 DB Link 기능에서 오동작할 수 있다. - Changes: NONE - Workaround: NONE BUG-41067 DB Link 기능을 사용 중에 네트워크 단절 등의 예외 상황이 발생할 때 서버가 종료한다. ALTIBASE HDB Patch Notes 6.3.1.4.1 7/7 - Module: dblink - Category: Fatal - Reproducibility: Impossible - Reproducing Conditions: NONE - Symptoms: DB Link 기능을 사용 중에 네트워크 단절 등의 예외 상황이 발생할 때 서버가 종료한다. - Changes: NONE - Workaround: NONE BUG-41073 Grouping sets 사용 시에 틀린 에러 메시지가 출력될 수 있다. - Module: qx - Category: Message Error - Reproducibility: Always - Reproducing Conditions: 재현 create table t1 (i1 integer); select count(*) from t1 group by grouping sets(1), i1, grouping(i1); 실제 결과 [ERR-31385 : _PROWID is not supported.] 예상 결과 not print error - Symptoms: Grouping sets 사용 시에 틀린 에러 메시지가 출력될 수 있다. - Changes: NONE - Workaround: NONE
- ALTIBASE HDB v.6.3.1.4.1 Patch Notes (Korean)
-
- ALTIBASE HDB v.6.1.1.2.2 Patch Notes (Korean)
ㅣ 2018-07-25
- ALTIBASE HDB 6.1.1.2.2 Patch Notes ALTIBASE HDB Patch Notes 6.1.1.2.2 2 / 11 목차 BUG-34751 JDBC에서 BIT 타입 처리 시 문제가 있습니다. ...................................... 3 BUG-35442 (i1,i2) IN ((i1,1)) predicate 사용시 ...
-
미리보기
ALTIBASE HDB 6.1.1.2.2 Patch Notes ALTIBASE HDB Patch Notes 6.1.1.2.2 2 / 11 목차 BUG-34751 JDBC에서 BIT 타입 처리 시 문제가 있습니다. ...................................... 3 BUG-35442 (i1,i2) IN ((i1,1)) predicate 사용시 서버가 비정상 종료할 수 있습니다. ............................................................................................................... 4 BUG-36052 DATEDIFF 함수가 비정상 동작하는 경우가 있습니다. ........................ 5 BUG-36449 JDBC에서 LOB 데이터 삽입 후 Statement 를 Close 하지 않고 Bind와 Execute를 반복 수행 시 속도가 느려질 수 있습니다. ........ 7 BUG-36484 OVER Clause에 ORDER BY 구문이 같이 사용될 경우 비정상 동작할 수 있습니다. .......................................................................................... 8 BUG-36518 Query에 In Bind가 있는 경우 커서를 재오픈하면 Some parameters were not bound. 에러가 발생합니다. ............................. 10 BUG-36540 이중화 환경에서 LOB 데이터에 대해 ACTIVE 서버에서 UPDATE 후 STANDBY 서버에서 동기화가 실패할 수 있습니다. ..................... 11 ALTIBASE HDB Patch Notes 6.1.1.2.2 2 / 11 ALTIBASE HDB Patch Notes 6.1.1.2.2 3 / 11 BUG-34751 JDBC에서 BIT 타입 처리에 문제가 있습니다. Module mt-datatype Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 JDBC에서 서버로부터 전달된 BIT 타입 처리 시 패딩이 되지 않아 비정상 동작하는 문제를 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.1.1.2.2 4 / 11 BUG-35442 (i1,i2) IN ((i1,1)) predicate 사용시 서버가 비정상 종료할 수 있습니다. Module qp-select Category Fatal 재현빈도 Always Reproducing Conditions 재현절차 DROP TABLE t1; CREATE TABLE t1( i1 INTEGER, i2 INTEGER ); SELECT count(*) FROM t1 WHERE (i1,i2) IN ((i1,1)); 수행결과 iSQL> SELECT count(*) FROM t1 WHERE (i1,i2) IN ((i1,1)); [ERR-91015 : Communication failure.] 예상결과 No rows selected. 증상 (i1,i2) IN ((i1,1)) predicate 사용시 서버가 비정상 종료할 수 있는 현상을 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A. ALTIBASE HDB Patch Notes 6.1.1.2.2 5 / 11 BUG-36052 DATEDIFF 함수가 비정상 동작하는 경우가 있습니다. Module mt-function Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 select datediff('01-JAN-2013', '30-DEC-2012', 'WEEK') from dual; select datediff('01-JAN-2013', '31-DEC-2012', 'WEEK') from dual; 수행결과 iSQL> select datediff('01-JAN-2013', '30-DEC-2012', 'WEEK') from dual; DATEDIFF('01-JAN-2013', '30-DEC-2012', 'WE --------------------------------------------- -1 1 row selected. iSQL> select datediff('01-JAN-2013', '31-DEC-2012', 'WEEK') from dual; DATEDIFF('01-JAN-2013', '31-DEC-2012', 'WE --------------------------------------------- -1 1 row selected. 예상결과 iSQL> select datediff('01-JAN-2013', '30-DEC-2012', 'WEEK') from dual; DATEDIFF('01-JAN-2013', '30-DEC-2012', 'WE --------------------------------------------- 0 1 row selected. iSQL> select datediff('01-JAN-2013', '31-DEC-2012', 'WEEK') from dual; DATEDIFF('01-JAN-2013', '31-DEC-2012', 'WE --------------------------------------------- 0 1 row selected. 증상 DATEDIFF 함수을 이용하여 enddate와 startdate 간 차이를 구할 때 비정상 동작하는 경우가 있어 수정합니다. 변경사항 Performance View N/A ALTIBASE HDB Patch Notes 6.1.1.2.2 6 / 11 Property N/A Compile Option N/A Error Code N/A Workaround select -datediff('30-DEC-2012', '01-JAN-2013', 'WEEK') from dual; select -datediff('31-DEC-2012', '01-JAN-2013', 'WEEK') from dual; ALTIBASE HDB Patch Notes 6.1.1.2.2 7 / 11 BUG-36449 JDBC에서 LOB 데이터 삽입 후 Statement 를 Close 하지 않고 Bind와 Execute를 반복 수행 시 속도가 느려질 수 있습니다. Module mm-jdbc Category Efficiency 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 PreparedStatement에서 LOB binding 후에 Insert 를 수행하고 Statement를 close하지 않고 계속 bind, update, commit을 반복 수행하면 삽입 속도가 느려지는 현상을 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround Insert 수행 후 Statement Close ALTIBASE HDB Patch Notes 6.1.1.2.2 8 / 11 BUG-36484 OVER Clause에 ORDER BY 구문이 같이 사용될 경우 비정상 동작할 수 있습니다. Module qp-dml-execute Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 drop table t1; create table t1 ( i1 integer, i2 integer, i3 integer, i4 integer, i5 integer ); insert into t1 values ( 1, 2, 3, 4, 1 ); insert into t1 values ( 1, 2, 3, 5, 2 ); insert into t1 values ( 1, 2, 3, 7, 2 ); insert into t1 values ( 1, 2, 3, 8, 2 ); insert into t1 values ( 1, 2, 5, 9, 1 ); select i2, i1, i4, SUM( i4 ) over ( order by i1 ) as SUM from t1; 수행결과 iSQL> select i2, i1, i4, SUM( i4 ) over ( order by i1 ) as SUM from t1; I2 I1 I4 SUM -------------------------------------------------------------- 2 1 8 8 2 1 9 17 2 1 7 24 2 1 4 28 2 1 5 33 예상결과 iSQL> select i2, i1, i4, SUM( i4 ) over ( order by i1 ) as SUM from t1; I2 I1 I4 SUM -------------------------------------------------------------- 2 1 8 33 2 1 9 33 2 1 7 33 2 1 4 33 2 1 5 33 증상 Order By와 Over 구문이 같이 사용될 경우 발생하는 오류를 수정하였습니다. 변경사항 Performance N/A ALTIBASE HDB Patch Notes 6.1.1.2.2 9 / 11 View Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.1.1.2.2 10 / 11 BUG-36518 Query에 In Bind가 있는 경우 커서를 재오픈하면 Some parameters were not bound. 에러가 발생합니다. Module mm-apre Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 1. Exec (In Bind) 2. Cursor Open 3. Fetch 4. Cursor Close 5. Cursor Reopen 수행결과 ------------------------------------------------------------------ [Open Cursor] ------------------------------------------------------------------ Error : [-331857] Some parameters were not bound. 예상결과 ------------------------------------------------------------------ [Open Cursor] ------------------------------------------------------------------ Successfully opened cursor 증상 Query에 In Bind가 있는 경우 커서를 재오픈하면 Some parameters were not bound. 에러가 발생하는 현상을 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A ALTIBASE HDB Patch Notes 6.1.1.2.2 11 / 11 BUG-36540 이중화 환경에서 LOB 데이터에 대해 ACTIVE 서버에서 UPDATE 후 STANDBY 서버에서 동기화가 실패할 수 있습니다. Module xa Category Functional Error 재현빈도 Always Reproducing Conditions 재현절차 N/A 수행결과 N/A 예상결과 N/A 증상 이중화 환경에서 LOB 데이터에 대해 ACTIVE 서버에서 UPDATE 후 STANDBY 서버에서 동기화가 실패할 수 있는 현상을 수정합니다. 변경사항 Performance View N/A Property N/A Compile Option N/A Error Code N/A Workaround N/A
- ALTIBASE HDB v.6.1.1.2.2 Patch Notes (Korean)