Altibase API Manual

Similar documents
Altibase API Manual

ALTIBASE 사용자가이드 Templete

Microsoft Word - ntasFrameBuilderInstallGuide2.5.doc

목차 BUG 문법에맞지않는질의문수행시, 에러메시지에질의문의일부만보여주는문제를수정합니다... 3 BUG ROUND, TRUNC 함수에서 DATE 포맷 IW 를추가지원합니다... 5 BUG ROLLUP/CUBE 절을포함하는질의는 SUBQUE

목차 BUG offline replicator 에서유효하지않은로그를읽을경우비정상종료할수있다... 3 BUG 각 partition 이서로다른 tablespace 를가지고, column type 이 CLOB 이며, 해당 table 을 truncate

목차 BUG DEQUEUE 의 WAIT TIME 이 1 초미만인경우, 설정한시간만큼대기하지않는문제가있습니다... 3 BUG [qp-select-pvo] group by 표현식에있는컬럼을참조하는집합연산이존재하지않으면결괏값오류가발생할수있습니다... 4

Windows 8에서 BioStar 1 설치하기

untitled

C# Programming Guide - Types

강의 개요

쉽게 풀어쓴 C 프로그래밊

Altibase Starting User's Manual

ALTIBASE 사용자가이드 Templete

DBMS & SQL Server Installation Database Laboratory

FileMaker 15 ODBC 및 JDBC 설명서

ORANGE FOR ORACLE V4.0 INSTALLATION GUIDE (Online Upgrade) ORANGE CONFIGURATION ADMIN O

13주-14주proc.PDF

Altibase Stored Procedure Manual

10.ppt

Spring Boot/JDBC JdbcTemplate/CRUD 예제

Connection 8 22 UniSQLConnection / / 9 3 UniSQL OID SET

PowerPoint Presentation

ALTIBASE HDB Patch Notes

SQL Developer Connect to TimesTen 유니원아이앤씨 DB 기술지원팀 2010 년 07 월 28 일 문서정보 프로젝트명 SQL Developer Connect to TimesTen 서브시스템명 버전 1.0 문서명 작성일 작성자

Microsoft PowerPoint - 10Àå.ppt

윈도우시스템프로그래밍

FileMaker ODBC 및 JDBC 가이드

iii. Design Tab 을 Click 하여 WindowBuilder 가자동으로생성한 GUI 프로그래밍환경을확인한다.

@OneToOne(cascade = = "addr_id") private Addr addr; public Emp(String ename, Addr addr) { this.ename = ename; this.a

chap 5: Trees

Microsoft PowerPoint - chap02-C프로그램시작하기.pptx

C++ Programming

Altibase Installation Manual

Microsoft PowerPoint - 04-UDP Programming.ppt

JAVA PROGRAMMING 실습 08.다형성

PowerPoint Template

PowerPoint 프레젠테이션

Microsoft PowerPoint Android-SDK설치.HelloAndroid(1.0h).pptx

JDBC 소개및설치 Database Laboratory

금오공대 컴퓨터공학전공 강의자료

untitled

이도경, 최덕재 Dokyeong Lee, Deokjai Choi 1. 서론

InsertColumnNonNullableError(#colName) 에해당하는메시지출력 존재하지않는컬럼에값을삽입하려고할경우, InsertColumnExistenceError(#colName) 에해당하는메시지출력 실행결과가 primary key 제약에위배된다면, Ins

슬라이드 제목 없음

PowerPoint Presentation

Microsoft PowerPoint - Supplement-03-TCP Programming.ppt [호환 모드]

<4D F736F F F696E74202D20B8AEB4AABDBA20BFC0B7F920C3B3B8AEC7CFB1E22E BC8A3C8AF20B8F0B5E55D>

슬라이드 1

Microsoft Word - src.doc

Microsoft PowerPoint - 03-TCP Programming.ppt

JAVA 프로그래밍실습 실습 1) 실습목표 - 메소드개념이해하기 - 매개변수이해하기 - 새메소드만들기 - Math 클래스의기존메소드이용하기 ( ) 문제 - 직사각형모양의땅이있다. 이땅의둘레, 면적과대각

슬라이드 1

JUNIT 실습및발표

PowerPoint 프레젠테이션

MVVM 패턴의 이해

API STORE 키발급및 API 사용가이드 Document Information 문서명 : API STORE 언어별 Client 사용가이드작성자 : 작성일 : 업무영역 : 버전 : 1 st Draft. 서브시스템 : 문서번호 : 단계 : Docum

윈도우시스템프로그래밍

8 장데이터베이스 8.1 기본개념 - 데이터베이스 : 데이터를조직적으로구조화한집합 (cf. 엑셀파일 ) - 테이블 : 데이터의기록형식 (cf. 엑셀시트의첫줄 ) - 필드 : 같은종류의데이터 (cf. 엑셀시트의각칸 ) - 레코드 : 데이터내용 (cf. 엑셀시트의한줄 )

Cloud Friendly System Architecture

게시판 스팸 실시간 차단 시스템

1. What is AX1 AX1 Program은 WIZnet 사의 Hardwired TCP/IP Chip인 iinchip 들의성능평가및 Test를위해제작된 Windows 기반의 PC Program이다. AX1은 Internet을통해 iinchip Evaluation

Microsoft PowerPoint - CSharp-10-예외처리

문서 템플릿

슬라이드 1

1. Windows 설치 (Client 설치 ) 원하는위치에다운받은발송클라이언트압축파일을해제합니다. Step 2. /conf/config.xml 파일수정 conf 폴더에서 config.xml 파일을텍스트에디터를이용하여 Open 합니다. config.xml 파일에서, 아

API 매뉴얼

Chap7.PDF

PowerPoint Presentation

단계

Microsoft PowerPoint - Java7.pptx

JAVA PROGRAMMING 실습 09. 예외처리

untitled

< 목차 > Ⅰ. 개요 3 Ⅱ. 실시간스팸차단리스트 (RBL) ( 간편설정 ) 4 1. 메일서버 (Exchange Server 2007) 설정변경 4 2. 스팸차단테스트 10

Bind Peeking 한계에따른 Adaptive Cursor Sharing 등장 엑셈컨설팅본부 /DB 컨설팅팀김철환 Bind Peeking 의한계 SQL 이최초실행되면 3 단계의과정을거치게되는데 Parsing 단계를거쳐 Execute 하고 Fetch 의과정을통해데이터

Microsoft PowerPoint - 3장-MS SQL Server.ppt [호환 모드]

임베디드시스템설계강의자료 6 system call 2/2 (2014 년도 1 학기 ) 김영진 아주대학교전자공학과

로거 자료실

adfasdfasfdasfasfadf

- JPA를사용하는경우의스프링설정파일에다음을기술한다. <bean id="entitymanagerfactory" class="org.springframework.orm.jpa.localentitymanagerfactorybean" p:persistenceunitname=

MySQL-.. 1

ISP and CodeVisionAVR C Compiler.hwp

q 이장에서다룰내용 1 객체지향프로그래밍의이해 2 객체지향언어 : 자바 2

PowerPoint 프레젠테이션

Microsoft PowerPoint SDK설치.HelloAndroid(1.5h).pptx

Microsoft PowerPoint - ch09 - 연결형리스트, Stack, Queue와 응용 pm0100

다른 JSP 페이지호출 forward() 메서드 - 하나의 JSP 페이지실행이끝나고다른 JSP 페이지를호출할때사용한다. 예 ) <% RequestDispatcher dispatcher = request.getrequestdispatcher(" 실행할페이지.jsp");

The Pocket Guide to TCP/IP Sockets: C Version

Microsoft PowerPoint - ch07 - 포인터 pm0415

표준프레임워크 Nexus 및 CI 환경구축가이드 Version 3.8 Page 1

PowerPoint Presentation

Microsoft PowerPoint - chap06-2pointer.ppt

DE1-SoC Board

<4D F736F F F696E74202D E20B3D7C6AEBFF6C5A920C7C1B7CEB1D7B7A1B9D62E >

gnu-lee-oop-kor-lec06-3-chap7

C++ Programming

Interstage5 SOAP서비스 설정 가이드

1. 자바프로그램기초 및개발환경 2 장 & 3 장. 자바개발도구 충남대학교 컴퓨터공학과

A Dynamic Grid Services Deployment Mechanism for On-Demand Resource Provisioning

리눅스설치가이드 3. 3Rabbitz Book 을리눅스에서설치하기위한절차는다음과같습니다. 설치에대한예시는우분투서버 기준으로진행됩니다. 1. Java Development Kit (JDK) 또는 Java Runtime Environment (JRE) 를설치합니다. 2.

<4D F736F F F696E74202D20B8B6C0CCC5A9B7CEC7C1B7CEBCBCBCAD202839C1D6C2F7207E203135C1D6C2F >

Transcription:

ALTIBASE HDB TM Application Development Application Program Interface User s Manual Release 6.5.1 (April 19, 2016)

----------------------------------------------------------- ALTIBASE Application Development Application Program Interface User s Manual Release 6.5.1 Copyright c 2001~2015 ALTIBASE Corp. All Rights Reserved. 본문서의저작권은 알티베이스에있습니다. 이문서에대하여당사의동의없이무단으로복제또는전용할수없습니다. 알티베이스 152-790 서울시구로구구로동 182-13 대륭포스트타워 Ⅱ 10 층전화 : 02-2082-1114 팩스 : 02-2082-1099 고객서비스포털 : http://support.altibase.com homepage: http://www.altibase.com -----------------------------------------------------------

목차 서문... 5 이매뉴얼에대하여... 6 1. PHP Interface... 11 ALTIBASE HDB PHP 모듈참고사항... 12 PHP 연동을위한 ODBC 매니저설치... 13 ODBC 연결을위한 PHP 함수... 15 2. PERL DBD DBI... 17 Perl DBD와 DBI 개요... 18 Perl 패키지설치... 19 ALTIBASE HDB DBD 설치... 20 3..NET Data Provider... 23.NET Data Provider의개요... 24 DTC와분산트랜잭션... 27.NET Data Provider 사용방법... 32.NET Data Provider 인터페이스... 43 연결정보... 45.NET Data Provider 예제... 50 분산트랜잭션 Trouble Shooting... 58 4. XA Interface... 61 XA 개요... 62 XA 인터페이스... 67 XA 사용... 72 XA 사용시제약사항... 79 JDBC 분산트랜잭션... 82 XA를사용한애플리케이션의문제해결... 95 5. iloader API... 99 목차 3

iloader API 개요... 100 iloader API 사용... 101 iloader API 데이타구조체... 102 iloader API... 108 6. CheckServer API... 123 CheckServer API 개요... 124 CheckServer API 사용... 125 CheckServer API 데이타구조체... 126 CheckServer API... 127 찾아보기... 133 4 API User s Manual

서문 서문 5

이매뉴얼에대하여 이매뉴얼은 API 사용법에대해설명한다. 대상사용자 이매뉴얼은다음과같은 ALTIBASE HDB 사용자를대상으로작성되었다. 데이타베이스관리자 성능관리자 데이타베이스사용자 응용프로그램개발자 기술지원부다음과같은배경지식을가지고이매뉴얼을읽는것이좋다. 컴퓨터, 운영체제및운영체제유틸리티운용에필요한기본지식 관계형데이타베이스사용경험또는데이타베이스개념에대한이해 컴퓨터프로그래밍경험 데이타베이스서버관리, 운영체제관리또는네트워크관리경험 소프트웨어환경 이매뉴얼은데이타베이스서버로 ALTIBASE HDB 버전 6.5.1 을 사용한다는가정하에작성되었다. 이매뉴얼의구성 이매뉴얼은다음과같이구성되어있다. 제 1 장 PHP Interface 이장은 PHP 에서 ODBC 함수를이용하여 ALTIBASE HDB 와연동하는방법을설명한다. 제 2 장 PERL DBD DBI 6 API User s Manual

이장은 PerL DBD (Database Driver) 와 DBI (Database Interface) 가무엇인지살펴보고, 이를사용하기위해 Perl 패키지설치및 ALTIBASE HDB DBD 설치를어떻게하는지, ALTIBASE HDB DBD 검증등은어떻게이뤄지는지에대해설명한다. 제 3 장.NET Data Provider 이장은마이크로소프트의 ADO.NET 인터페이스를 ALTIBASE HDB 와함께사용하기위한방법을설명한다. 제 4 장 XA Interface 이장은 XA 표준을소개하고, 분산트랜잭션의기본개념과 XA 인터페이스를설명한다. 그리고 ODBC, Embedded SQL, JDBC 프로그램에서글로벌트랜잭션을사용하여 ALTIBASE HDB 에접근하는방법에대해설명한다. 제 5 장 iloader API 이장은 ALTIBASE HDB 서버로부터데이타를다운로드또는서버로데이타를업로드하는응용프로그램을작성할수있는인터페이스인 ALTIBASE HDB iloader API 를소개한다. 제 6 장 CheckServer API 이장은 ALTIBASE HDB 서버가비정상종료했는지를감시하는응용프로그램을작성하기위해사용하는인터페이스인 ALTIBASE HDB CheckServer API 를소개한다. 문서화규칙 이절에서는이매뉴얼에서사용하는규칙에대해설명한다. 이규칙을이해하면이매뉴얼과설명서세트의다른매뉴얼에서정보를쉽게찾을수있다. 여기서설명하는규칙은다음과같다. 구문다이어그램 샘플코드규칙 구문다이어그램 이매뉴얼에서는다음구성요소로구축된다이어그램을사용하여, 명령문의구문을설명한다. 구성요소 예약어 의미 명령문이시작한다. 완전한명령문이아닌구문요소는 화살표로시작한다. 서문 7

명령문이다음라인에계속된다. 완전한명령문이아닌구문요소는이기호로종료한다. 명령문이이전라인으로부터계속된다. 완전한명령문이아닌구문요소는이기호로시작한다. ; 명령문이종료한다. 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; 8 API User s Manual

. 표시 ENAME ----------------------- SWNO HJNO 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_; 관련자료 자세한정보를위하여다음문서목록을참조하기바란다. Installation Guide Administrator s Manual Replication Manual CLI User's Manual Precompiler User s Manual ODBC User's Manual isql User s Manual Utilities Manual Error Message Reference 온라인매뉴얼 Altibase 고객서비스포털 (http://support.altibase.com) 에서국문 서문 9

및영문매뉴얼 (PDF, HTML) 을받을수있다. Altibase 는여러분의의견을환영합니다. 이매뉴얼에대한여러분의의견을보내주시기바랍니다. 사용자의의견은다음버전의매뉴얼을작성하는데많은도움이됩니다. 보내실때에는아래내용과함께고객서비스포털 (http://support.altibase.com/kr/) 로보내주시기바랍니다. 사용중인매뉴얼의이름과버전 매뉴얼에대한의견 사용자의성함, 주소, 전화번호이외에도 Altibase 기술지원설명서의오류와누락된부분및기타기술적인문제들에대해서이주소로보내주시면정성껏처리하겠습니다. 또한, 기술적인부분과관련하여즉각적인도움이필요한경우에도고객서비스포털을통해서비스를요청하시기바랍니다. 여러분의의견에항상감사드립니다. 10 API User s Manual

1. PHP Interface 이장에서는 PHP 에서 ODBC 함수를이용하여 ALTIBASE HDB 와 연동하는방법을설명한다. PHP Interface 11

ALTIBASE HDB PHP 모듈참고사항 PHP 에서지원하는데이타타입은다음과같다. resource, int, bool, double, float, string, array, HashTable ALTIBASE HDB 서버의포트번호와 ALTIBASE HDB 에서제공한샘플프로그램의 db.php 에서포트번호를맞춰야한다. 12 API User s Manual

PHP 연동을위한 ODBC 매니저설치 유닉스또는윈도우환경에서 PHP 로 ALTIBASE HDB 에연동을하기위해서는먼저 ODBC 매니저를설치해야한다. 이절에서는유닉스, 리눅스와윈도우에서 ODBC 매니저를설치하고사용환경을설정하는방법을설명한다. 유닉스와리눅스 리눅스또는유닉스환경에서다음절차대로 ODBC 매니저를 설치한다. 1. unixodbc 다운로드한다. unixodbc 홈페이지 (http://www.unixodbc.org) 에서 다운로드할수있다. 2. unixodbc 설치한다. 다운로드한 unixodbc 소스파일을컴파일해야한다. 컴파일된라이브러리를특정위치에설치하려면, configure 할 때 prefix 옵션으로경로를입력한다../configure -prefix= 설치경로 -enable-gui=no - enabledrivers=no make make install 3. unixodbc 환경을설정한다. ODBCSYSINI 환경변수의값을 ALTIBASE HDB 설치계정의홈디렉터리경로로설정한다. export ODBCSYSINI=~ 4. unixodbc Driver Manager 가설치된경로를다음과같이 환경변수에추가한다. 라이브러리경로를설정하는환경변수는 플랫폼과운영체제의 bit 에따라서 LD_LIBRARY_PATH, LD_LIBRARY_PATH_64, SHLIB_PATH 중의하나일수있다. 다음은 unixodbc 를 /usr/local/odbcdrivermanager32 또는 /usr/local/odbcdrivermanager64 에설치한예이다. export LD_LIBRARY_PATH= /usr/local/odbcdrivermanager32/lib:$ld_library_path export LD_LIBRARY_PATH_64= /usr/local/odbcdrivermanager64/lib:$ld_library_path_64 PHP Interface 13

5. ODBCSYSINI 환경변수의경로에다음 2 개의파일을생성한다. odbc.ini odbcinst.ini 6. odbcinst.ini 는실제내용이없는 0 byte 파일이다. 7. odbc.ini 에는 DSN 이름및 ALTIBASE HDB ODBC 드라이버 파일의위치, 서버의 IP 주소, 접속포트번호를아래처럼 설정한다. [Altibase] Driver = /home/altibase/altibase_home/lib/libaltibase_odbc.so Server = 127.0.0.1 Port = 20300 윈도우 윈도우환경은 ODBC 매니저가기본으로설치되어있어, ALTIBASE HDB 를설치할때 ODBC 매니저에 ALTIBASE HDB ODBC 드라이버를자동으로등록한다. 14 API User s Manual

ODBC 연결을위한 PHP 함수 ALTIBASE HDB 는표준 ODBC 를지원함으로써 PHP 에서이 ODBC 함수들을사용하여 ALTIBASE HDB 서버와연동할수있다. PHP 에서사용하는 ODBC 함수들에대한자세한설명은아래의 PHP 공식매뉴얼사이트를참조한다 : http://php.morva.net/manual/kr/index.php Sample Test <? // SYSTEM DSN, USER_ID, USER_PASSWORD $conn = odbc_connect("altibase", "SYS", "MANAGER"); if ($conn) // direct-execution echo "now, i create table t1 (id integer, name char(20)<br>"; odbc_exec($conn, "drop table t1"); odbc_exec($conn, "create table t1 (id integer, name char(20))"); // prepare-execution echo "now, i insert into t1 value (100, Lee)<br>"; $stmt = odbc_prepare ($conn, "insert into t1 values (?,?)"); $Insert = array (100, "Lee"); if (!odbc_execute($stmt, &$Insert)) echo ("error"); // single-selection $res = odbc_do ($conn, "select id, name, sysdate from T1"); odbc_fetch_row ($res); $ID = odbc_result($res, 1); $NAME = odbc_result($res, 2); $DATE = odbc_result($res, 3); echo ("id = $ID, name = $NAME datetime = $DATE <br>"); odbc_close($conn);?> PHP Interface 15

2. PERL DBD DBI 이장에서는 PerL DBD (Database Driver) 와 DBI (Database Interface) 가무엇인지살펴보고, 이를사용하기위해 Perl 패키지설치및 ALTIBASE HDB DBD 설치를어떻게하는지, ALTIBASE HDB DBD 검증등은어떻게이뤄지는지에대해설명한다. PERL DBD DBI 17

Perl DBD 와 DBI 개요 DBI 는 Perl 을위한표준데이타베이스인터페이스모듈이다. 이는일련의메소드 (methods) 와속성 (attributes) 을정의한것으로, 실제사용하는데이타베이스에독립적인일관된인터페이스를제공한다. DBI 는애플리케이션에서동일한인터페이스를사용하여여러다른데이타베이스에서제공하는 DBD 에접근하는것을가능하게한다. 실제로데이타베이스와통신을하는것은 DBD 이다. ALTIBASE HDB 에서제공하는드라이버 (DBD) 를 DBD::altibase 라고부른다. 이들메소드와속성들은 database 메소드와속성, 그리고 statement 메소드와속성으로나뉘어져있다. DBI Altibase DBD Oracle DBD DB2 DBD mysql DBD Altibase Oracle DB2 mysql [ 그림 3-1] PERL DBD 와 DBI 구조도 18 API User s Manual

Perl 패키지설치 Perl 패키지설치절차 1. 사용하는장비의운영체제의버전에맞게 Perl 패키지를 다운로드받는다. 2. 임의의디렉터리에서패키지 (ex. perl-5.8.5.tar.gz) 의압축을 푼다. gzip -cd perl-5.8.5.tar.gz tar xvf 3. Perl 패키지의압축을푼디렉터리에서 configure 를수행한다../configure 4. Perl 패키지의압축을푼디렉터리에서 make 를수행한다. make 5. Perl 패키지의압축을푼디렉터리에서 root 계정으로 컴파일한모듈을설치한다. make install 6. Event 모듈설치를위해서 event 패키지 (ex. Event-1.00.tar.gz) 를다운로드받는다. 7. 임의의디렉터리에서 Event-1.00.tar.gz 의압축을푼다. gzip -cd Event-1.00.tar.gz tar xvf 8. Event 패키지의압축을푼디렉터리에서 configure 를 수행한다../configure 9. Event 패키지의압축을푼디렉터리에서 make 를수행한다. make 10. Event 패키지의압축을푼디렉터리에서 root 계정으로 컴파일한모듈을설치한다. make install PERL DBD DBI 19

ALTIBASE HDB DBD 설치 ALTIBASE HDB PERL DBD 설치절차 1. perl V 를실행하여 dlext 설정이올바른지확인한다. 이때 HP 는 sl, 다른플랫폼은 so 이어야한다. 이값이 잘못되었으면다시 Perl 을설치한다. 2. Perl DBI 설치 Perl DBD 컴파일하기위한선행절차로 Perl DBI 패키지를 설치한다. 방법 1) root 계정으로 # perl -MCPAN -e shell prompt> install DBI 방법 2) 상기방법으로안될경우, 아래 ftp 사이트에서 DBI 패키지를다운받아컴파일한후에설치한다. ftp://ftp.nuri.net/pub/cpan/modules/by-module/dbi 2-1) perl Makefile.PL 2-2) make 2-3) make install 3. 아래위치에서 ALTIBASE HDB Perl DBD 를다운로드하고설치한다. ALTIBASE HDB Perl DBD 는 32bit 이기때문에 ALTIBASE HDB 32bit 클라이언트패키지또는 32bit 서버패키지가이미설치되어있어야하고, ALTIBASE_HOME 환경변수도올바르게설정되어있어야한다. http://data.altibase.com/download_back/altibase/p ERL-DBD/altibase-perlDBD.tar.gz gzip cd altibase-perldbd.tar.gz tar xvf - 4. 다운로드한패키지내의 install.mk 를사용해서 ALTIBASE HDB DBD 를생성하는데필요한 Makefile 을생성한다. make -f install.mk 5. 컴파일한다. make ALTIBASE HDB Perl DBD 는 shared library 형태로생성된다. HP 플랫폼에서는 altibase.sl 의이름으로생성된다. HP 이외의플랫폼에서는 altibase.so 의이름으로생성되며, 생성되는위치는 blib/arch/auto/dbd/altibase 이다. 20 API User s Manual

6. root 계정으로 make install 을실행한다. ALTIBASE HDB Perl DBD 가 Perl 에설치된다. 이예제에서는 ALTIBASE HDB DBD 는아래위치에설치된다. /opt/perl_5.8.8/bin/lib/site_perl/5.8.8/ia64.arch REV_0/auto/DBD/altibase 7. LD_PRELOAD 환경변수를설정한다. HP 또는일부플랫폼은이단계를수행해야한다. 이작업을 수행하지않을경우오류메시지가나타난다. 8. perl test.pl 을수행해서테스트한다. ALTIBASE HDB 서버를구동한후, test.pl 파일의소스코드를 아래와같이수정한후에 perl test.pl 을수행한다. my $dbh = DBI- >connect("dbi:altibase:dsn=127.0.0.1;uid=sys;pwd =MANAGER;CONNTYPE=1;NLS_USE=US7ASCII;PORT_NO=209 99", "", "", 'RaiseError' => 1); PERL DBD DBI 21

3..NET Data Provider 이장에서는마이크로소프트의 ADO.NET 인터페이스를 ALTIBASE HDB 와함께사용하기위한방법을설명한다..NET Data Provider 23

.NET Data Provider 의개요 개요 ALTIBASE HDB.NET Data Provider 는마이크로소프트의 ADO.NET 인터페이스를 ALTIBASE HDB 에서사용하기위해구현한것이다. 즉, 닷넷프레임워크 (.NET Framework) 기반의애플리케이션에서 ALTIBASE HDB 를사용하기위해서는 ALTIBASE HDB.NET Data Provider 를사용해야한다. ADO.NET 인터페이스는닷넷프레임워크를사용하여 DBMS 와같은데이타소스에접근한다. 닷넷프레임워크는 ODBC 와 OLEDB 인터페이스를지원하며, SQLServer 와 ORACLE 에접근하는방법을기본으로제공한다. 닷넷프레임워크에기반한 Data Provider 의역할은데이타소스에접근하여명령어를수행하고결과값을추출해오는것이다. 이렇게가져온결과값을 ADO.NET DataSet 클래스를이용하여개발자가가공하고다시데이타소스에반영하게된다. 하지만데이터베이스에접속하기까지상당한시간이소용되기때문에연결풀링 (Connection Pooling) 을지원하여연결시간을절약할수있다. 연결풀링은연결이생성되면풀러에서연결을할당하고, 연결이닫히면풀러로반환하여재사용할수있다. 또한 ALTIBASE HDB.NET Data Provider 는 MSDTC(Microsoft Distributed Transaction Coordinator, 이하 DTC) 를기반으로다수의리소스매니저 (Resource Manager, 이하 RM) 들간에분산트랜잭션을지원한다. DTC 로초기화된분산트랜잭션에 XA 인터페이스를이용하여 XA 트랜잭션으로연동시켜 XA RM 으로참여한다. DTC 는마이크로소프트윈도우즈운영체제에서시스템서비스로제공하는미들웨어이며, ALTIBASE 뿐만아니라다른제품의 RM 간에도분산트랜잭션을수행할수있다. ADO.NET 인터페이스의가장큰장점은 ALTIBASE HDB 버전을업그레이드하더라도, 새로운 ALTIBASE HDB 와일치하도록 CLI 라이브러리만업그레이드하면 Data Provider 나애플리케이션을변경하지않고계속사용할수있다는것이다. 기타 ADO.NET 의자세한내용은마이크로소프트의홈페이지 (http://www.msdn.com) 를참고한다. 24 API User s Manual

요구사항.NET Framework 알티베이스 HDB 패키지에포함된.NET Data Provider 는.NET Framework 2.0 이상, Entity FrameWork 는.NET Framework 3.5 SP1 이상에서사용하기를권장한다. ADO.NET 버전에따라서다른.NET Data Provide 라이브러리파일을제공하므로, 사용하려는 ADO.NET 버전에적합한라이브러리를사용해야한다. Altibase CLI 라이브러리 ALTIBASE HDB.NET Data Provider 는 Altibase CLI 라이브러리를이용하여데이타베이스서버에접속하므로 Altibase CLI 라이브러리를설치해야한다. 알티베이스 HDB ( 서버또는클라이언트 ) 패키지에기본으로제공된다. DTC 시스템서비스분산트랜잭션을수행하기위해서는 DTC 시스템서비스가설치되어있어야한다. 또한 ALTIBASE HDB.NET Data Provider 는 XA 트랜잭션과연동시켜분산트랜잭션을수행하기때문에 DTC 설정시 'XA 트랜잭션사용 ' 옵션을반드시활성화시켜야한다. 주의사항및제약사항.NET Data Provider 는 CLI 라이브러리를사용하므로해당시스템에맞는 odbccli_sl.dll 과함께사용해야한다..NET Framework 버전에따라일부구현이다르므로, 해당하는.NET Framework 버전을위해빌드된.NET Data Provider 를사용해야한다. ColumnName 속성은 DataReader, CommandBuilder 등에서대소문자를구별한다. 테이블을생성할때큰따옴표를이용해칼럼이름을감싸지않은경우, 컬럼이름은대문자로변환된다. 이경우대문자로된칼럼이름을사용해야올바른값을가져올수있다. NUMBER, NUMERIC, FLOAT, DECIMAL 타입컬럼으로부터 DataReader.GetValue() 를사용해서데이타를가져올때, 데이타손실이발생할수있다. 이는이함수가숫자데이타를.NET System.Decimal 타입으로변환하는데, 이때가져온데이타의범위가 System.Decimal 로표현할수있는범위를넘는경우이다..NET Data Provider 25

ALTIBASE HDB.NET Data Provider 는다중쿼리문의실행을지원하지않는다. 여러개의 SQL 문을한번에실행하려면저장프로시저를사용하도록한다. 연결풀링에대한제약사항은연결풀링의제약사항을참고하기바란다. 분산트랜잭션수행에대한제약사항은 DTC 와분산트랜잭션절의 DTC 제약사항을참고하길바란다. 26 API User s Manual

DTC 와분산트랜잭션 DTC Distributed Transaction Coordinator( 이하 DTC) 는분산트랜잭션을관리하기위하여마이크로소프트사가제공하는미들웨어이다. DTC 는 OLE 트랜잭션을기반으로분산트랜잭션을초기화및제어하고, 분산트랜잭션의 ACID 속성을보장한다. 이를위해 2 단계커밋프로토콜 (two phase commit protocol, 2PC protocol) 을사용한다. DTC 는 OLE 트랜잭션뿐만아니라 X/Open 에서 XA 트랜잭션, IBM LU 트랜잭션등으로도호환이가능하다. 알티베이스의분산트랜잭션 ALTIBASE HDB.NET Data Provider 는 OLE 트랜잭션과 XA 트랜잭션으로연동되기때문에 OLE 트랜잭션과호환되는다른제품의 RM 과분산트랜잭션을수행할수있다. ALTIBASE HDB.NET Data Provider 는 XA 인터페이스를 Onepipe connection 방식으로 DTC 와연동한다. 그리고 ALTIBASE HDB.NET Data Provider 는읽기전용최적화 (read-only optimization), 단일단계커밋 (single phase commit) 의 DTC 최적화기법을지원한다. DTC 는현재수행중인트랜잭션정보를저장하는로깅 (logging) 기능을제공한다. 이정보를이용해복구 (recovery) 를수행하거나현재수행중인분산트랜잭션의목록이나통계정보를조회할수있다. 뿐만아니라추적 (tracing data) 기능도제공하여이미수행했던트랜잭션정보도추적할수있다. DTC 에대한자세한내용은 Distributed Transaction Coordinator(https://msdn.microsoft.com/enus/library/ms684146(v=vs.85).aspx) 를참고한다..NET Data Provider 27

[ 그림 3-1] DTC 를이용한분산트랜잭션 ADO.NET 분산트랜잭션 ADO.NET 의분산트랜잭션은 DTC 시스템서비스에서초기화된 OLE 트랜잭션을객체화하여제어한다. ADO.NET 에서초기화한분산트랜잭션은 DTC 시스템서비스에의해관리되고, 완료명령시 2 단계커밋프로토콜 (2PC protocol) 을실행한다. DTC 시스템서비스에서제공하는복구 (revoery), 로깅 (logging), 추적 (tracing), 목록, 통계등모두그대로이용할수있다..NET 2.0 부터는 LTM(Lightweight Transaction Manager) 을지원하여최적화된트랜잭션관리자를제공한다. 만약단일리소스관리자 (RM) 가참여할때에는 DTC 에의해분산트랜잭션으로수행되는것이아니라,.NET 자체의트랜잭션관리자인 LTM 에의해로컬트랜잭션으로수행된다. 그리고둘이상의 RM 이참여할때에만분산트랜잭션으로수행된다. 첫번째리소스관리자의참여시 LTM 에의해로컬트랜잭션으로수행되다가두번째리소스관리자참여시첫번째참여자에게분산트랜잭션으로승격시키도록요청한다. 이를 ' 트랜잭션프로모션 (transaction 28 API User s Manual

promotion)' 이라한다. 첫번째리소스관리자는 DTC 시스템서비스로분산트랜잭션을초기화한후수행중인로컬트랜잭션을분산트랜잭션으로상승시킨다. 이를 ' 트랜잭션에스컬레이션 (transaction escalation)' 이라한다. 분산트랜잭션객체를두번째참여자에게전달하여분산트랜잭션에참여시키고그이후에도그분산트랜잭션에참여하게된다. ADO.NET 인터페이스.NET 2.0 에서 ADO.NET 의트랜잭션프로그래밍모델은크게명시적트랜잭션프로그래밍모델 (explicit transaction programming model) 과암묵적트랜잭션프로그래밍모델 (implicit transaction programming model) 이있다. 명시적트랜잭션프로그래밍모델에는 DbConnection.EnlistTransaction 메소드를이용해 DbConnection 객체를트랜잭션에참여시키는방식이다. ALTIBASE HDB.NET Data Provider 에서명시적으로트랜잭션에참여시키기위해서는연결문자열 (connection string) 에 'Enlist=false' 속성을설정해야한다. 암묵적트랜잭션프로그래밍모델은 DbConnection.Open 메소드호출시내부에서접속후앰비언트트랜잭션 1 (ambient transaction) 에참여시키는방식이다. ALTIBASE HDB.NET Data Provider에서 DbConnection.Open 메소드호출시암묵적으로트랜잭션에참여하기위해서는연결문자열에 'Enlist=true' 속성을설정하거나 Enlist 속성을설정하지않아야한다. 두가지모델모두로컬트랜잭션뿐만아니라분산트랜잭션도지원한다. ALTIBASE HDB.NET Data Provider 에서명시적트랜잭션프로그래밍모델로써명시적으로분산트랜잭션에참여하기위해추가적으로 AltibaseConnection.EnlistDistributedTransaction 메소드도지원한다. ADO.NET 에서분산트랜잭션을종료하기위해서 CommitableTransaction.Commit 메소드또는 1 앰비언트트랜잭션 (ambient transaction) 이란, Transaction.Current 프로퍼티로얻은트랜잭션객체를 말하며현재쓰레드에서실행중인트랜잭션객체이다..NET Data Provider 29

CommitableTransaction.Abort 메소드를호출할수있다. CommitableTransaction.Commit 메소드를호출하면 DTC 시스템서비스에서 2 단계커밋프로토콜 (2 PC protocol) 을실행한다. 준비단계 (prepare phase) 에서참여한모든리소스관리자 (RM) 에게커밋 (commit) 이가능한지여부를확인하여, DTC 시스템서비스가최종커밋 (commit) 을할것인지롤백 (rollback) 을할것인지결정하여로깅 (logging) 한후, 두번째인커밋단계 (commit phase) 를실행한다. 이때첫번째단계인준비단계 (prepare phase) 수행즉, 최종커밋 (commit) 여부가결정되면 CommitableTransaction.Commit 메소드에서반환되고두번째단계 (second phase) 는백그라운에서비동기적으로처리된다. CommitableTransaction.Commit 메소드가반환직후또다른트랜잭션에참여하려면이전트랜잭션이완료될때까지대기해야한다. CommitableTransaction.Abort 메소드를호출할경우에도롤백 (rollback) 명령이비동기적으로수행될수있다. 트랜잭션상태가활성화된 (active) 상태라면또다른트랜잭션에참여할수없음을주의해야한다. DTC 복구 DTC 는시스템실패 (system failure), 통신실패 (communication failure) 등을대비하여복구 (recovery) 기능을제공한다. 실패하는구성요소 (component) 에따라크게 hot recovery 와 cold recovery 로나뉜다. Hot recovery 는 RM 이실패한경우 RM 이재시작될때까지 DTC 가주기적으로검사하여복구기능을수행한다. cold recovery 는 DTC 가실패한경우 DTC 가재시작될때복구기능을수행한다. 이경우모두준비단계에서로깅 (logging) 된결정된명령, 커밋 (commit) 또는롤백 (rollback) 을기반으로복구시킨다. 응용프로그램이실패한경우에는 DTC 가이를감지하여바로복구기능을수행한다. ALTIBASE HDB.NET Provider 와같이 XA 트랜잭션으로연동하였다면, DTC 내부의 XA mapper 구성요소 (component) 에의해 XA 복구기능을수행한다. 다수의노드에걸쳐작업을수행하고분산트랜잭션을종료하기위해커밋 (commit) 명령을내리면 2 단계커밋프로토콜 (2 PC protocol) 을시작하는데, 준비단계 (prepare phase) 이후커밋단계 (commit phase) 에서리소스관리자 (RM) 에완료명령 (commit 명령또는 abort 명령 ) 이도착하지않으면해당리소스 30 API User s Manual

관리자 (RM) 는트랜잭션을커밋해야할지롤백해야할지모르는 indoubt 상태로지속될수있다. 이런트랜잭션을 in-doubt 트랜잭션이라한다. In-doubt 트랜잭션은커밋트리 (commit tree) 에서중간의통신회선실패, DTC 시스템서비스의로그초기화등으로발생할수있다. 따라서지속적인 In-doubt 상태를방지하려면, 수동으로해결할수있는방식을 DTC 시스템서비스에서제공하고 ALTIBASE HDB 에서도제공해야한다. DTC 시스템서비스에서는트랜잭션목록 GUI 에서수동으로해결 (heuristic completion) 할수있고, ALTIBASE HDB 에서는 XA_HEURISTIC_COMPLETE 시스템프로퍼티와 XA_INDOUBT_TX_TIMEOUT 시스템프로퍼티를설정하여해결할수있다. DTC 제약사항 기본적은제약사항은 ALTIBASE HDB.NET Data Provider 의분산트랜잭션은 OLE 트랜잭션과 XA 인터페이스를이용해 XA 트랜잭션으로연동시키기때문에 ALTIBASE HDB 에서제공하는 XA 트랜잭션의제약사항을포함한다. XA 트랜잭션의제약사항을제외한 ALTIBASE HDB.NET Data Provider 의제약사항은아래와같다. XA 트랜잭션의제약사항은 'XA 사용시제약사항 ' 을참조해주시길바란다. 다른트랜잭션에참여하거나접속을해제할경우대기상태가발생할수있다. 커밋명령을내리면 2 단계커밋프로토콜을실행하는데두번째인커밋단계는백그라운드에서비동기적으로처리되므로, 이를완료될때까지대기한다. 지속적인 indoubt 트랜잭션이될경우를대비하여 ALTIBASE HDB 의 XA_HEURISTIC_COMPLETE 시스템프로퍼티와 XA_INDOUBT_TX_TIMEOUT 시스템프로퍼티를설정하기를권장한다. 분산트랜잭션의완료명령 (commit 명령또는 abort 명령 ) 없이접속을해제할경우, XA 트랜잭션제약에따라트랜잭션을강제로롤백 (rollback) 시킨다. DTC 의제약사항으로써하나의분산트랜잭션에참여할수있는리소스관리자 (RM) 는최대 32 개이며, 동시에수행할수있는분산트랜잭션의수는 DTC 시스템서비스의로그파일크기에의존한다..NET Data Provider 31

.NET Data Provider 사용방법 ALTIBASE HDB 가설치된디렉터리 ( 환경변수 %ALTIBASE_HOME%) 내의 lib 디렉터리에.NET Data Provider 가존재한다. 파일의이름은다음과같다. %ALTIBASE_HOME%\lib\Altibase.Data.AltibaseClient.dll %ALTIBASE_HOME%\lib\Altibase.Data.Entity.dll.NET 응용프로그램컴파일 ALTIBASE HDB.NET Data Provider 를사용한애플리케이션은아래 2 가지방법으로컴파일할수있다. 커맨드라인에서컴파일하는방법 커맨드라인에서소스파일을컴파일을할때에는아래와같이 DLL 를참조합니다. csc /r:%altibase_home%\lib\altibase.data.altibaseclient.dll 프로그램명.cs IDE 환경에서컴파일하는방법 IDE (Integrated Development Environment) 환경에서.NET Data Provider 등록하는방법이다. ( 예 MS Viaual Studio) 1. 새프로젝트를연다. 32 API User s Manual

[ 그림 3-2] 새프로젝트열기 2..NET Data Provider 를등록하기위해, References 에마우스 오른쪽버튼을클릭하여 참조추가 메뉴를클릭한다. [ 그림 3-3] 프로젝트의참조추가설정 3. ALTIBASE HDB 설치디렉터리내의 lib 디렉터리에서 Altibase.Data.AltibaseClient.dll 를찾아등록한다. ALTIBASE.NET Data Provider 33

HDB 설치디렉터리는환경변수 %ALTIBASE_HOME% 으로 확인한다. [ 그림 3-4].NET Data Provider 를프로젝트에등록 4. 프로젝트를빌드하고생성된실행파일을실행한다. 배열바인딩 (Array Binding) ALTIBASE HDB.NET Data Provider 는배열바인딩을지원하는데, 즉배열형태의데이타에대하여파라미터바인딩이가능하다. 이는일반적인바인딩방법보다적은네트워크비용으로여러개의열을처리하므로속도향상을기대할수있다. 현재는입력 (Input) 파라미터로만배열바인딩을지원하며, 출력 (Output) 이나입출력공용파라미터의배열바인딩은지원하지않는다. 배열바인딩순서는다음과같다. 1. 바인드하려는변수들을모두배열로잡는다. 이때배열 크기는 AltibaseCommand 클래스의 ArrayBindCount 값보다 크거나같아야한다. 2. 배열변수들을파라미터에바인드한다. 만약바인드하려는 칼럼이 CHAR, VARCHAR, BLOB 타입인경우에는, 파라미터 34 API User s Manual

설정시 AltibaseParameter 클래스의 ArrayBindSize 를배열 요소중가장큰것과같은크기로설정해야한다. 3. AltibaseCommand 클래스의 ArrayBindCount 값을세팅한다. 예 : 한번에 100 개씩입력하는경우 ArrayBindCount = 100; 4. SQL 구문을실행한다. 주의사항 배열바인딩할때다음사항을주의해야한다. ArrayBindCount 의유효범위는 1 부터 65535 까지이다. 배열크기를무조건크게잡는다고속도가빨라지는것은 아니므로적당한크기로바인딩한다. CHAR, VARCHAR, BLOB 타입의경우배열단일요소의 데이타길이가 ArrayBindSize 를넘을경우에러가발생한다. NCHAR, NVARCHAR 타입의경우, ArrayBindSize 값은 byte 가아닌문자수로세팅해야한다. BLOB 타입의경우, 소스프로그램에서배열타입으로 Object 를사용하고, 배열원소는 byte[] 를사용한다. 예 : byte[] var1; byte[] var2; Object[] var = new Object[2] var1, var2; CLOB, BYTE, NIBBLE, BIT, VARBIT, GEOMETRY 타입의 배열바인딩은지원하지않는다. 예제 using System; using System.Data; using Altibase.Data.AltibaseClient; class ArrayBind static void Main() AltibaseConnection con = new AltibaseConnection(); con.connectionstring = "DSN=127.0.0.1;UID=sys;PWD=manager;NLS_USE=KO16KSC5601"; con.open(); Console.WriteLine("Connected successfully"); // table: create table t1 (c1 int, c2 varchar(12)); // 3 records const int arraybindcount = 3; int[] c1 = new int[arraybindcount] 100, 200, 300; String[] c2 = new String[arrayBindCount] "APPLE", "ORANGE", "GRAPE" ;.NET Data Provider 35

AltibaseCommand cmd = new AltibaseCommand(); cmd.connection = con; //===================================================== // bind parameters //===================================================== cmd.commandtext = "insert into t1 values (?,?)"; AltibaseParameter prm1 = new AltibaseParameter("c1", DbType.Int32); prm1.direction = ParameterDirection.Input; prm1.value = c1; AltibaseParameter prm2 = new AltibaseParameter("c2", DbType.AnsiString); prm2.direction = ParameterDirection.Input; prm2.value = c2; prm2.arraybindsize = 12; // max element size in bytes cmd.parameters.add(prm1); cmd.parameters.add(prm2); //===================================================== // execute INSERT //===================================================== cmd.arraybindcount = arraybindcount; cmd.executenonquery(); //===================================================== // SELECT //===================================================== IDataReader sdatareader = null; cmd.parameters.clear(); cmd.commandtext = "select * from t1"; sdatareader = cmd.executereader(); while (sdatareader.read()) for (int i = 0; i < sdatareader.fieldcount; i++) Console.Write("[" + sdatareader.getvalue(i) + "] "); Console.WriteLine(); sdatareader.close(); con.close(); con.dispose(); ALTIBASE HDB.NET Data Provider 사용선언 ALTIBASE HDB.NET Data Provider 클래스들을사용려면, 먼저 36 API User s Manual

아래와같이선언하여야있다. using Altibase.Data.AltibaseClient; 트랜잭션처리 ADO.NET 에서제공하는트랜잭션처리인터페이스를이용하여 트랜잭션을처리할수있다. ADO.NET 인터페이스를이용한트랜잭션처리는 AltibaseTransaction 객체를사용하는방법과 CommittableTransaction 객체를사용하는방법이있다. AltibaseTransaction 객체를사용하는방법은아래의예제와같이 AltibaseConnection.BeginTransaction() 메소드를통해트랜잭션 객체를얻어사용하는방법이다. 이방법은로컬트랜잭션으로만 수행할수있다. AltibaseConnection sconn = new AltibaseConnection(sConnStr); sconn.open(); // 트랜잭션시작 AltibaseTransaction strans = sconn.begintransaction(); AltibaseCommand scmd = sconn.createcommand(); // 트랜잭션작업... // TODO // 트랜잭션끝 strans.commit(); CommitableTransaction 객체는트랜잭션에암시적또는명시적으로참여할수있다. ALTIBASE HDB.NET Data Provider 에서암시적인방식으로트랜잭션에참여하기위해서는접속문자열에 Enlist 속성을설정하지않거나 'Enlist=true' 라고설정한다. 명시적인참여는접속문자열에 'Enlist=false' 로설정한다. ALTIBASE HDB.NET Data Provider 는추가적으로 AltibaseConnection.EnlistDistributedTransaction 메소드를지원하여명시적으로분산트랜잭션에참여할수도있다..NET Data Provider 37

연결풀링 (Connection Pooling) 애플리케이션이데이터베이스서버에연결하는과정은여러단계를거치므로시간이많이걸리며, 동일한과정을여러번진행할수있다. ADO.NET 에서는연결하고닫히는횟수를최소화하기위해연결풀링을제공한다. 연결풀링은연결에필요한소유권을유지하고있다. 이를위해풀러는연결요청을받으면연결이가능한지확인하고연결을할당하거나새로운연결을풀러에생성하여할당한다. 연결이닫힐때에도연결을바로해제하지않고풀러에반환한다. 연결풀링은 Max Pool Size 의값에따라다르며, 기본적으로 100 개까지사용할수있다. 풀만들기 연결이되면연결문자열 (Connection String) 과정확하게일치하는알고리즘에따라연결풀이생성된다. 연결이될때마다연결문자열이연결풀과정확하게일치하지않을경우새로운풀이생성된다. 연결문자열의속성이나대소문자및공백수의차이가있어도다른풀로인식한다. 연결문자열에 MIN POOL SIZE 의값을설정하면해당값만큼연결풀이자동으로생성된다. 만약이값을설정하지않았다면기본값이 0 이므로자동생성되는연결은없다. 연결할당및추가연결을요청받으면연결문자열에해당하는풀을확인하여연결을할당하거나, 생성하여연결한다. 만약연결풀이없다면 Max Pool Size( 기본값 100 개 ) 속성값까지연결풀을생성할수있으며, 이값을초과할경우에는 Connection Life Time 값을초과하는연결풀이예외를발생할때까지대기한다예외가발생한연결풀은자동으로제거가되며, 명시적으로연결풀을닫으면연결이제거되는것이아니라풀러에회수된다. 연결제거 응용프로그램에서명시적으로연결풀을닫거나제거하지않으면연결풀러는정기적으로연결풀을검사하여연결을제거한다. 연결은 Connection Life Time 속성에설정한시간동안사용되지않을경우제거되며, Min Pool Size 의값만큼최소한의풀을남겨두고회수된다. 그리고예외가발생한연결풀도제거된다. 만약풀러에회수된 38 API User s Manual

연결풀을선택하여사용할경우정확하게일치되는지여부를 검사하고사용하는것이아니기때문에실제로연결할때예외가 발생할수있다. 풀지우기 AltibaseConnection 클래스에서풀을제거할수있는메소드는 ClearPool 및 ClearAllPools 이있다. ClearPool 메소드는지정된 연결풀을지우며, ClearAllPools 메소드는모든연결풀을지운다. 제약사항 연결풀은 Min Pool Size 속성값만큼자동으로생성되며, 서버에 접속할수있는개수이상은만들수없다. Pool Size 의값은 클라이언트에서연결할수있는풀의개수를설정한다. 스키마 ALTIBASE HDB 는 GetSchema() 메소드를사용해서 MetadataCollections, DataSourceInformation, DataTypes, Restrictions, ReservedWords 와같은공통스키마이외에도 ALTIBASE HDB 에서지원하는다음과같은메타정보스키마를조회해볼수있도록지원한다. 스키마메타테이블설명 Users Tables Views Sequences Synonyms Indexes Columns SYS_USERS_ SYS_TABLES_ SYS_VIEWS_ V$SEQ SYS_SYNONYMS_ SYS_INDICES_ SYS_COLUMNS_ 사용자관련정보를저장하는메타테이블테이블관련정보를저장하는메타테이블뷰관련정보를저장하는메타테이블시퀀스관련정보를저장하는성능뷰시노님관련정보를저장하는메타테이블인덱스정보를기록하고있는메타테이블칼럼관련정보를저장하는메타테이블.NET Data Provider 39

Constraints SYS_CONSTRAINTS_ 제약조건관련정보를저장하는메타테이블 Procedures SYS_PROCEDURES_ 저장프로시저및함수관련정보를저장하는메타테이블 저장프로시저및함수의 ProcedurePa SYS_PROC_PARAS_ 파라미터관련정보를 rameters 저장하는메타테이블 IndexColum ns SYS_INDEX_COLUM NS_ 인덱스칼럼관련정보를저장하는메타테이블 ConstraintC olumns SYS_CONSTRAINT_ COLUMNS_ 제약조건칼럼관련정보를저장하는메타테이블 Triggers SYS_TRIGGERS_ 트리거관련정보를저장하는메타테이블 [ 표 3-1] ALTIBASE에서지원하는메타정보스키마 ALTIBASE HDB 에서지원하는각각의스키마에대한자세한설명은 General Reference 의데이타딕셔너리를참조한다. ALTIBASE HDB.NET Data Provider 클래스 ALTIBASE HDB 의.NET Data Provider 는데이타베이스와의연결, 질의실행및결과검색을위한기능을제공한다. 이기능들은아래표에서보여주는 4 개의클래스에기반하고있다. 각클래스들의하위메소드기능은마이크로소프트의 ADO.NET 문서을참조한다. 클래스설명데이타베이스와의연결을설정하고 AltibaseConnection 트랜잭션을시작할수있다. 데이타베이스에서질의문을실행하고 AltibaseCommand 매개변수를표시할수있다. 데이타베이스에서명령수행에대한 AltibaseDataReader 결과를가져와출력할수있다. DataSet에데이타를채우고 AltibaseDataAdapter 데이타베이스로저장된데이타를갱신할수있다. [ 표 3-2] 연결및질의실행, 결과검색을위한 ALTIBASE HDB.NET Data Provider 클래스 40 API User s Manual

ALTIBASE HDB.Net Data Provider 는예외처리, 저장프로시저실행과트랜잭션처리등을위해다음클래스들을제공한다. 클래스설명데이타베이스오류나,.Net Framework을 AltibaseException 통해받은클라이언트오류를받아표시할수있다. SQL 명령및저장프로시저에대한 AltibaseParameter 입력, 출력파라미터를정의한다. 데이타베이스에서트랜잭션관련명령을 AltibaseTransaction 수행할수있도록한다. [ 표 3-3] 예외처리, 트랜잭션처리를위한 ALTIBASE HDB.NET Data Provider 클래스 ALTIBASE HDB.NET Data Provider 데이타타입 테이블칼럼이나파라미터의데이타타입을선언하기위해서 AltibaseDbType 클래스가사용된다. 아래표를통해 AltibaseDbType 클래스, ALTIBASE HDB 가 제공하는데이타타입과.NET Framework 의데이타타입간의 관계를확인할수있다. ALTIBASE HDB AltibaseDbType 데이타베이스칼럼.NET Framework 타입 BigInt BIGINT Int64 BitArray BIT BitArray[] Blob BLOB Byte[] Binary BYTE Byte[] Char CHAR String Clob CLOB String DateTime DATE DateTime Decimal DECIMAL Decimal Double DOUBLE Double Float FLOAT Decimal Geometry GEOMETRY Byte[] Integer INT Int32 NChar NCHAR String.NET Data Provider 41

NibbleArray NIBBLE NibbleArray Number NUMBER Decimal Numeric NUMERIC Decimal NVarChar NVARCHAR String Real REAL Float SmallInt SMALLINT Int16 VarBitArray VARBIT BitArray[] VarChar VARCHAR String [ 표 3-4] 데이타타입간의관계 SQL 구문내에내셔널캐릭터를포함하는상수문자열을 사용하려면, 해당문자열바로앞에 N 을붙이면된다. 주의사항 다음은알티베이스에서제공하는 Entity Provider 를사용할때의주의사항이다. 데이타베이스에 BIT 또는 VARBIT 데이타타입의컬럼을생성할때크기가반드시 1 이어야한다. 데이타베이스에 NUMERIC 또는 NUMBER 데이타타입의컬럼을생성할때 precision 은 1 에서 38 사이의크기이고 scale 은 0 에서 precision 사이의크기여야한다. NIBBLE, BLOB, CLOB 데이타타입을지원하지않는다. NIBBLE 과 BLOB 대신에 BYTE 데이타타입을, CLOB 대신에 VARCHAR 데이타타입을사용하도록한다. 42 API User s Manual

.NET Data Provider 인터페이스 지원하지않는인터페이스 아래표는알티베이스.NET Data Provider 가지원하지않는 인터페이스목록이다. 클래스 구분 구성요소 AltibaseConnection M ChangeDatabase P DataSource P ServerVsion AltibaseCommand M Cancel P CommandTimeout P CommandType AltibaseDataReader M GetData M GetDbDataReader M GetProviderSpecificFieldType M GetProviderSpecificValue M GetProviderSpecificValues P Depth P HasRows P VisibleFieldCount AltibaseDataAdapter M AddToBatch(IDbCommand command) M CrearBatch M ExecuteBatch M GetBatchedParameter M GetBatchedRecordsAffected(int commandidentifier, out int recordsaffected, out Exception error) M InitializeBatching M TerminateBatching AltibaseDataSourceEnumerator A AltibaseFactory M CreateDataSourceEnumerator.NET Data Provider 43

M CreatePermission AltibaseParameter M ResetDbType M Clone AltibaseParameterCollection M AddRange AltibasePermission A AltibasePermissionAttribute A M: Method P: Property A: 클래스전체 AltibaseDataReader.Depth 는언제나 0 을반환한다. 상속받는추상클래스에기본구현이있는메소드는해당하는기본메소드를사용한다. 기본구현을제공하는멤버는다음과같다. CreateCommandBuilder CreateConnectionStringBuilder CreateDataSourceEnumerator CreatePermission GetProviderSpecificFieldType GetProviderSpecificValue GetProviderSpecificValues VisibleFieldCount GetBatchedRecordsAffected(int commandidentifier, out int recordsaffected, out Exception error) 기본구현이없는멤버는모두 NotImplementedException 을발생시킨다. 44 API User s Manual

연결정보 이절에서는 ALTIBASE HDB 에접속할때사용가능한연결 속성들의정보를기술하고, 연결속성을설정하는방법에대해 설명한다. 연결문자열 (Connection String).NET 응용프로그램에서 ALTIBASE HDB 에접속하기위한연결 문자열은다음과같다. Server=127.0.0.1;PORT=20091;User=sys;Password=manage r 연결속성정보 ALTIBASE HDB 에접속할때사용가능한연결속성에대해기술한다. 각속성에대한기술에는다음의항목들이포함된다. 기본값 : 명시하지않을경우기본적으로사용되는값 값의범위 : 지정가능한값 필수여부 : 반드시지정해야하는지여부 설정범위 : 설정한속성이시스템전체에영향을미치는지또는해당세션에만영향을미치는지여부 설명 : 속성에대한설명 application name 기본값값의범위필수여부설정범위설명.NET Altibase Data Provider 임의의문자열 No N/A 접속된클라이언트의애플리케이션정보를나타낸다. V$SESSION의 CLIENT_APP_INFO 칼럼에출력되는값이다. connection life time 기본값 0.NET Data Provider 45

값의범위필수여부설정범위설명 Unsigned Integer 범위내의숫자값 [1-2 31 ] No N/A 연결풀이이속성값만큼사용하지않을경우풀러에서제거된다. 단위는초 (sec) 이며, 이값이 0이면무한대를의미한다. connection timeout 기본값 15 값의범위 Unsigned Integer 범위내의숫자값 [1-2 31 ] 필수여부 No 설정범위 N/A 설명연결풀에연결될때까지대기하는시간이며, 단위는초 (sec) 이다. 이값이 0이면무한대를의미한다. data source 기본값 값의범위 필수여부 설정범위 설명 No N/A 데이터소스의이름을나타내며아래의조건에따라사용되는값이달라진다. - server 값이존재하면, data source 값은무시됨. - server 값이존재하지않고, data source 값과동일한 ODBC 데이터원본이존재하면 dsn(data source name) 이사용. - server 값이존재하지않고, 동일한 ODBC 데이터원본이존재하지않으면서버의 IP 또는호스트이름을사용. encoding 기본값 값의범위 필수여부 No 46 API User s Manual

설정범위 N/A 설명클라이언트의문자집합을설정한다. enlist 기본값값의범위필수여부설정범위설명 true [true false] No N/A 해당쓰레드의트랜잭션컨텍스트 (Transaction.Current 프로퍼티 ). 즉현재코드가실행되고있는트랜잭션인앰비언트트랜잭션 (ambient transaction) 에암묵적인참여여부를나타낸다. max pool size 기본값 100 값의범위 Unsigned Integer 범위내의숫자값 [1-2 31 ] 필수여부 No 설정범위 N/A 설명 생성할수있는최대한의연결풀개수를나타낸다. min pool size 기본값 0 값의범위 Unsigned Integer 범위내의숫자값 [1-2 31 ] 필수여부 No 설정범위 N/A 설명연결풀이풀러에있는최소한의개수를나타낸다. 풀이생성되면이값만큼연결풀이자동생성되며, connection life time의기간동안사용되지않을경우풀러에서제거된다. 그러나연결풀이제거되더라도이속성에정한개수만큼유지되어야한다. nchar literal replace 기본값 false.net Data Provider 47

값의범위필수여부설정범위설명 [true false] No 세션 SQL문내에서내셔널캐릭터셋을가지는상수문자열의사용여부를결정한다. password 기본값 값의범위필수여부설정범위설명 데이터베이스사용자비밀번호 Yes N/A 접속을시도하는데이터베이스서버의사용자비밀번호를나타낸다. persist security info 기본값값의범위필수여부설정범위설명 false [true false] No N/A 연결정보에서문자열을가져올때비밀번호를포함할지여부를나타낸다. pooling 기본값 true 값의범위 [true false] 필수여부 No 설정범위 N/A 설명 연결풀링을사용할것인지를결정한다. port 기본값 20300 값의범위 [0~65535] 필수여부 설정범위 설명 No N/A 접속을시도할 ALTIBASE HDB 서버의포트번호를지정한다. 48 API User s Manual

prefer ipv6 기본값값의범위필수여부설정범위설명 false [true false] No N/A IPv6 주소를 IPv4 주소보다우선사용할것인지를결정한다. false이면 IPv4 주소를사용하여데이터베이스서버에접속한다. server 기본값값의범위필수여부설정범위설명 localhost No N/A 접속을시도할 ALTIBASE HDB 서버의 IP 주소또는호스트이름이다. transaction timeout 기본값값의범위필수여부설정범위설명 서버의설정값 Unsinged Integer 범위의숫자값 [1-2 31 ] No N/A UPDATE 수행시간이설정된값을초과하면자동으로종료한다. 단위는초 (sec) 이다. 이값이 0이면무한대를의미한다. user id 기본값 값의범위필수여부설정범위설명 데이터베이스사용자 ID Yes N/A 접속을시도하는데이터베이스서버의사용자 ID를나타낸다..NET Data Provider 49

.NET Data Provider 예제 DDL 과 DML 단순예제 AltibaseConnection 클래스를사용하여 ALTIBASE HDB 에 접근하여 test_goods 테이블을생성하고데이타를삽입한후 검색한다. using Altibase.Data.AltibaseClient; class ConnectionTest static void Main(string[] args) string sconnectionstring = "Server=127.0.0.1;PORT=20091;User=sys;Password=manager"; AltibaseConnection conn = new AltibaseConnection(sConnectionString); try conn.open(); // This connects to the database AltibaseCommand command = new AltibaseCommand("drop table test_goods", conn); query query try command.executenonquery(); // This executes a catch (Exception ex) command.commandtext = "create table test_goods ( gno char(10), gname char(20), location char(9), stock integer, price numeric(10, 2))"; command.executenonquery(); // This executes a command.commandtext = "insert into test_goods values ('A111100001','IM-300','AC0001',1000,78000)"; command.executenonquery();//this executes a query command.commandtext = "insert into test_goods values ('A111100002','IM-310','DD0001',100,98000)"; command.executenonquery();//this executes a query command.commandtext = "insert into test_goods values ('B111100001','NT-H5000','AC0002',780,35800)"; command.executenonquery();//this executes a query command.commandtext = "select * from test_goods"; AltibaseDataReader dr = command.executereader(); 50 API User s Manual

Console.WriteLine(" GNO GNAME LOCATION STOCK PRICE "); Console.WriteLine( "=========================================================== ========================"); while (dr.read()) for (int i = 0; i < dr.fieldcount; i++) Console.Write("\t0", dr[i]); // This outputs the retrieved data Console.WriteLine(); catch (Exception ex) Console.WriteLine(ex.ToString()); conn.close(); // This closes the connection to the database using Altibase.Data.AltibaseClient; class ConnectionTest static void Main(string[] args) string sconnectionstring = "DSN=127.0.0.1;PORT_NO=20091;UID=sys;PWD=manager;"; // This is the host IP address and port number of the database server used as the DSN AltibaseConnection conn = new AltibaseConnection(sConnectionString); try conn.open(); // This connects to the database AltibaseCommand command = new AltibaseCommand("drop table test_goods", conn); query query try command.executenonquery(); // This executes a catch (Exception ex) command.commandtext = "create table test_goods ( gno char(10), gname char(20), location char(9), stock integer, price numeric(10, 2))"; command.executenonquery(); // This executes a command.commandtext = "insert into test_goods values ('A111100001','IM-300','AC0001',1000,78000)"; command.executenonquery();//this executes a query command.commandtext = "insert into test_goods values ('A111100002','IM-310','DD0001',100,98000)";.NET Data Provider 51

command.executenonquery();//this executes a query command.commandtext = "insert into test_goods values ('B111100001','NT-H5000','AC0002',780,35800)"; command.executenonquery();//this executes a query command.commandtext = "select * from test_goods"; AltibaseDataReader dr = command.executereader(); Console.WriteLine(" GNO GNAME LOCATION STOCK PRICE "); Console.WriteLine( "=========================================================== ========================"); while (dr.read()) for (int i = 0; i < dr.fieldcount; i++) Console.Write("\t0", dr[i]); // This outputs the retrieved data Console.WriteLine(); catch (Exception ex) Console.WriteLine(ex.ToString()); conn.close(); // This closes the connection to the database 실행결과 GNO GNAME LOCATION STOCK PRICE ================================================== A111100001 IM-300 AC0001 1000 78000 A111100002 IM-310 DD0001 100 98000 B111100001 NT-H5000 AC0002 780 35800 벌크복사 AltibaseBulkCopy 를이용해서 bulkcopy_source 테이블에서 bulkcopy_destination 테이블로데이타를복사한다. using System; using System.Data; using Altibase.Data.AltibaseClient; class Program static void Main(string[] args) if (args.length!= 2) Console.WriteLine("\t[NOT PASSED]: Invalid argument"); return; 52 API User s Manual

string connectionstring = GetConnectionString(args); using (AltibaseConnection sourceconnection = new AltibaseConnection(connectionString)) sourceconnection.open(); // Perform an initial count on the destination table. AltibaseCommand commandrowcount = new AltibaseCommand( "SELECT COUNT(*) FROM BULKCOPY_DESTINATION;", sourceconnection); long countstart = System.Convert.ToInt32( commandrowcount.executescalar()); Console.WriteLine("Starting row count = 0", countstart); // Get data from the source table as a AltibaseDataReader. AltibaseCommand commandsourcedata = new AltibaseCommand( "SELECT A1, A2, A3, A4 FROM BULKCOPY_SOURCE;", sourceconnection); AltibaseDataReader reader = commandsourcedata.executereader(); // Open the destination connection. In the real world you would // not use AltibaseBulkCopy to move data from one table to the other // in the same database. This is for demonstration purposes only. using (AltibaseConnection destinationconnection = new AltibaseConnection(connectionString)) destinationconnection.open(); // Set up the bulk copy object. // Note that the column positions in the source // data reader match the column positions in // the destination table so there is no need to // map columns. using (AltibaseBulkCopy bulkcopy = new AltibaseBulkCopy(destinationConnection)) bulkcopy.destinationtablename = "BULKCOPY_DESTINATION"; destination. try // Write from the source to the bulkcopy.writetoserver(reader); catch (Exception ex) Console.WriteLine(ex.Message); finally.net Data Provider 53

// Close the AltibaseDataReader. The AltibaseBulkCopy // object is automatically closed at the end // of the using block. reader.close(); // Perform a final count on the destination // table to see how many rows were added. long countend = System.Convert.ToInt32( commandrowcount.executescalar()); Console.WriteLine("Ending row count = 0", countend); Console.WriteLine("0 rows were added.", countend - countstart); private static string GetConnectionString(string[] args) // To avoid storing the sourceconnection string in your code, // you can retrieve it from a configuration file. return "Server=" + args[0] + ";" + "PORT=" + args[1] + ";" + "User=sys;Password=manager"; 연결풀링예제 ADO.NET 에서연결풀링를사용하는예제는다음과같다. static void Main(string[] sargs) AltibaseConnection cn = new AltibaseConnection(); AltibaseConnection cn2 = new AltibaseConnection(); AltibaseCommand cmd = new AltibaseCommand(); string cnstr = "Server=127.0.0.1;Port=20300;User=user;Password=pwd;Pooli ng=true;min Pool Size=0;Max Pool Size=10"; cn.connectionstring = cnstr; cn.open(); Console.WriteLine("Successfully Connected."); cmd.connection = cn; cmd.commandtext = "SELECT TO_CHAR(SYSDATE, 'YYYY-MM-DD HH:MI:SS') FROM DUAL"; AltibaseDataReader dr = cmd.executereader(); while (dr.read()) Console.WriteLine(dr[0].ToString()); dr.close(); cn.close(); cn2.connectionstring = cnstr; 54 API User s Manual

cn2.open(); // Pooled Connection cn2.close(); 분산트랜잭션예제 ADO.NET 에서분산트랜잭션에참여하는방법은암묵적인방법과명시적인방법 2 가지가존재한다. 암묵적으로트랜잭션에참여하는방법은연결문자열에 'Enlist=true' 속성을설정하거나, 이속성을설정하지않고 DbConnection.Open 메소드를호출하면된다. 명시적으로트랜잭션에참여하는방법은 'Enlist=false' 속성을설정하고연결수립이후 DbConnection.EnlistTransaction 메소드또는 AltibaseConnection.EnlistDistributedTransaction 메소드를호출하면된다. 암묵적트랜잭션참여 분산트랜잭션에암묵적으로참여하여 commit 을수행하는예제이다. 만약 Rollback 을수행하려면, scope.complete() 메소드를호출하지않는다. var cn1_str = "Server=127.0.0.1;PORT=20300;User=root;Password=1234"; var cn2_str = "Server=127.0.0.1;PORT=20301;User=root;Password=1234;Enli st=true"; using (var scope = new TransactionScope()) using (var cn1 = new AltibaseConnection(cn1_str)) cn1.open(); //... using (var cn2 = new AltibaseConnection(cn2_str)) cn2.open(); //... scope.complete(); 명시적트랜잭션참여 분산트랜잭션에명시적으로참여하여 commit 을수행하는.NET Data Provider 55

예제이다. 명시적으로트랜잭션에참여하기위해서는참여하고자 하는트랜잭션객체를 AltibaseConnect.EnlistTransaction 메소드로호출한다. 만약 rollback 을수행하려면, tx.commit() 메소드대신 tx.rollback() 메소드를호출한다. var cn1_str = "Server=127.0.0.1;PORT=20300;User=root;Password=1234;Enli st=false"; var cn2_str = "Server=127.0.0.1;PORT=20301;User=root;Password=1234;Enli st=false"; var tx = new CommittableTransaction(); using (var cn1 = new AltibaseConnection(cn1_str)) cn1.open(); cn1.enlisttransaction(tx); //... using (var cn2 = new AltibaseConnection(cn2_str)) cn2.open(); cn2.enlisttransaction(tx); //... tx.commit(); 위예제는두번째접속 cn2 가참여하기전까지로컬트랜잭션으로수행되다가 cn2 가참여되는순간부터분산트랜잭션으로승격되어수행된다. 만약처음부터분산트랜잭션에참여하려면, 아래의예제처럼 AltibaseConnect.EnlistDistributedTransaction 메소드를사용하여참여한다. var cn1_str = "Server=127.0.0.1;PORT=20300;User=root;Password=1234;Enli st=false"; var cn2_str = "Server=127.0.0.1;PORT=20301;User=root;Password=1234;Enli st=false"; var tx = new CommittableTransaction(); var dtx = TransactionInterop.GetDtcTransaction(tx); // transaction escalation using (var cn1 = new AltibaseConnection(cn1_str)) cn1.open(); cn1.enlistdistributedtransaction((system.enterpriseservic es.itransaction)dtx); //... 56 API User s Manual

using (var cn2 = new AltibaseConnection(cn2_str)) cn2.open(); cn2.enlistdistributedtransaction((system.enterpriseservic es.itransaction)dtx); //... tx.commit();.net Data Provider 57

분산트랜잭션 Trouble Shooting 분산트랜잭션을수행시정상적으로동작하지않을때몇가지사항을확인하여해결할수있다. 질문 답변 ALTIBASE HDB.NET Data Provider 와함께분산트랜잭션이 동작하지않습니다. 분산트랜잭션이동작하지않을때다음사항들을우선확인하기바랍니다. DTC 시스템서비스가정상적인수행여부확인 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSD TC\XADLL 레지스트리위치에 'odbccli_sl.dll' 값이등록되었는지확인 ( 참고 : Wow64 인경우레지스트리위치는 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node \Microsoft\MSDTC\XADLL) DTC 시스템서비스에서 'XA 트랜잭션사용 ' 옵션의설정여부확인질문 분산트랜잭션을수행하였으나, 정상적으로동작하지않습니다. 답변 분산트랜잭션은다음의경우정상적으로동작하지않습니다. 트랜잭션타임아웃이초과할경우 하나의분산트랜잭션에 32 개이상의리소스관리자 (RM) 가참여를시도할경우 DTC 시스템서비스의로그파일크기를초과하도록다수의분산트랜잭션을수행할경우질문 커밋이후또다른트랜잭션에참여하거나접속을해제할때접속 58 API User s Manual

해제가완료될때까지장기간대기할수있다. 답변 커밋트리 (commit tree) 에서중간통신회선실패, DTC 시스템서비스의로그초기화등으로인해 2 단계커밋프로토콜 (2 PC protocol) 중두번째단계 (second phase) 의명령이전달받지못할경우가발생한다. 이를대비하여 ALTIBASE HDB 의 XA_HEURISTIC_COMPLETE 시스템프로퍼티와 XA_INDOUBT_TX_TIMEOUT 시스템프로퍼티를설정하기를권장한다. 질문 분산트랜잭션에참여시도시순간적으로실패할수도있다. 답변 DbConnection.EnlistTransaction 메소드또는 AltibaseConnection.EnlistDistributedTransaction 메소드를이용해분산트랜잭션에참여를시도할때실패할수있다. 참여과정에서 DTC 시스템서비스는 XA 복구 (recovery) 를위해 xa_open 함수로 RM 에접속을시도한다. 이때네트워크장애등일시적인현상으로접속이실패할수있으며, 이경우다시참여를시도할것을권장한다..NET Data Provider 59

4. XA Interface 이장은 XA 표준을소개하고, 분산트랜잭션의기본개념과 XA 인터페이스를설명한다. ODBC, Embedded SQL, JDBC 프로그램에서글로벌트랜잭션을사용하여 ALTIBASE HDB 에접근하는방법에대해설명한다. 또한 XA 의제약사항및애플리케이션에서발생할수있는문제를다루는법을살펴본다. XA Interface 61

XA 개요 XA 구조는 X/Open 에서정한분산트랜잭션 ( 또는글로벌트랜잭션 ) 처리를위한표준모델이다. 분산트랜잭션이란 2 개또는그이상의네트워크상에서의데이타베이스시스템간의트랜잭션으로서글로벌트랜잭션 (Global Transaction) 이라고도한다. 데이타베이스시스템은트랜잭션의자원역할을하고, 트랜잭션매니져 (Transaction Manager, TM) 는이러한자원에관련된모든동작에대하여트랜잭션을생성하고관리한다. 즉다수의데이타베이스서버들이제공하는자원을분산애플리케이션이공유할수있도록해주거나또는글로벌트랜잭션으로처리할수있도록한다. XA 는하나이상의데이타베이스에서트랜잭션을처리하는애플리케이션에유용한구조이다. XA 관련용어 Application (AP) 애플리케이션은필요한트랜잭션과트랜잭션으로구성된작업을정의한다. 애플리케이션은 Embedded SQL 또는 ODBC CLI 로작성할수있다. 글로벌트랜잭션 (Global Transaction) TM 에의해관리되는트랜잭션전체를의미하며, 분산트랜잭션이라고도한다. 휴리스틱완료 (Heuristic Completion) in-doubt 트랜잭션에서어떤원인으로커밋등의다음명령을받지못해서 RM 스스로커밋또는롤백을수행한경우휴리스틱커밋 (Heuristic Commit) 이나휴리스틱롤백 (Heuristic Rollback) 이라고한다. 이러한상태를휴리스틱완료 (Heuristic Completion) 가되었다고한다. 일반적으로네트워크실패또는트랜잭션타임아웃에의해발생한다. In-doubt 트랜잭션 RM 즉 DBMS 에 prepare 된후커밋또는롤백메시지를받기전까지의트랜잭션브랜치을의미한다. 또는 Pending 트랜잭션이라고도한다. 리소스매니저 (Resource Manager, RM) 리소스매니저는 XA 트랜잭션에의해접근되는자원을 62 API User s Manual

관리한다. 예를들어관계형데이타베이스, 트랜잭션큐, 또는파일시스템등이있을수있다. 트랜잭션브랜치 (Transaction Branch) 이는하위트랜잭션으로글로벌트랜잭션의일부이다. 이는글로벌트랜잭션에참여하는 RM 들중하나에서실행된다. 하나의트랜잭션브랜치는하나의 XID (XA 의트랜잭션아이디 ) 와일대일로대응한다. Transaction Manager (TM) 이는트랜잭션을정의하는 API 를제공한다. 트랜잭션의커밋과롤백을책임지고, 복구를수행한다. TM 은모든 RM 이서로일관성을가지도록 2 단계커밋엔진을가지고있다. Transaction Processing Monitor (TPM) 이는하나이상의 AP 가하나이상의 RM 으로요청하는트랜잭션의흐름을조정한다. RM 은이기종이가능하며네트워크를통해서분산될수있다. TPM 은커밋과롤백작업을조정함으로써분산트랜잭션을완료한다. TPM 에속하는 TM 부분은분산된커밋과롤백작업의타이밍을결정할책임이있다. 즉 TPM 은 2 단계커밋을제어할책임이있다. TM 은분산된커밋과롤백작업을관리하기때문에, 모든 RM 에대해알수있어야하며직접통신할수있어야한다. 이를위해 TM 은 XA 인터페이스를사용한다. ALTIBASE HDB 의경우, TM 은 ALTIBASE HDB 에서제공하는 XA 라이브러리를사용할수있다. TX 인터페이스 AP 는 TX 인터페이스를사용하여 TM 을통해서트랜잭션을제어한다. AP 가직접 XA 인터페이스를사용하지는않는다. AP 는개별트랜잭션브랜치의작업을알지못하고, 애플리케이션쓰레드가직접트랜잭션브랜치작업에참여하지도않는다. 글로벌트랜잭션의브랜치들은 AP 를대신하여 TM 에의해서관리된다. AP 는다만 TM 에게글로벌트랜잭션을커밋또는롤백할것을요청할뿐이다. XA 의구조 아래그림에서보는것처럼, 하나이상의 AP (Application Program), TM (Transaction Manager) 과하나이상의 RM (Resource Manager) 이분산트랜잭션에관여한다. XA Interface 63

[ 그림 5-1] XA 구조 AP 가 TX 인터페이스를사용하여 TM 에게분산트랜잭션이시작됐다고알리면, TM 은어떤 RM ( 데이타베이스시스템 ) 이분산트랜잭션의대상인지확인한다. TM 은내부적으로 RM 에서수행할트랜잭션브랜치를위한 XID 를생성하여 XA 인터페이스를호출하여 RM 에게 XID 를전달한다. 각각의 RM (DB 노드 ) 은전송된 XID 에대응하는트랜잭션브랜치를처리하기시작한다. 그리고 TM 으로부터그트랜잭션의종료요청이올때까지는 AP 로부터요청된작업을그 XID 에해당하는글로벌트랜잭션내의작업으로인지하고트랜잭션브랜치에서작업을진행한다. 트랜잭션을종료하려면, AP 는 TX 인터페이스를사용하여 TM 에게분산트랜잭션이종료됐다고알린다. 그러면 TM 은 XA 인터페이스를사용하여분산트랜잭션을진행한 RM 에게커밋또는롤백을명령한다. XA 와 2 단계커밋 ALTIBASE HDB XA Interface 는 2 단계커밋 (2-Phase Commit, 2PC) 을따른다. 2PC 는 Prepare 단계와 Commit 단계로구성된다. 1 단계인 Prepare 에서 TM 은분산트랜잭션에참여하는모든데이타베이스노드들즉 RM 에게커밋의가능성을확인한다. 64 API User s Manual

RM 은커밋이가능하다면 Prepare 상태를 TM 에게전달한다. 그러나가능하지않다면 RM 은이를롤백시키기위한상태값을반환한다. 2 단계인 Commit 에서 TM 은 Prepare 의상태를전달받을때까지대기한다. 그리고 Prepare 가정상적으로진행되었다면, 모든 RM 에게커밋명령을보낸다. 그러나하나의 RM 이라도 Prepare 가되지않았다면, 롤백명령을보낸다. xa_switch_t 구조체 XA 인터페이스를지원하는모든 RM 은 RM 에대한정보와각인터페이스의 entry point 를가지는 xa_switch_t 구조체를제공한다. ALTIBASE HDB 는 altibase_xa_switch 라는이름으로제공한다. struct xa_switch_t char name[rmnamesz]; manager */ long flags; specific options */ long version; /* name of resource /* resource manager int (*xa_open_entry)(/*_ char *, int, long _*/); /*xa_open fn pointer*/ int (*xa_close_entry)(/*_ char *, int, long _*/); /*xa_close fn pointer*/ int (*xa_start_entry)(/*_ XID *, int, long _*/); /*xa_start fn pointer*/ int (*xa_end_entry)(/*_ XID *, int, long _*/); /*xa_end fn pointer*/ int (*xa_rollback_entry)(/*_ XID *, int, long _*/); /*xa_rollback fn pointer*/ int (*xa_prepare_entry)(/*_ XID *, int, long _*/); /*xa_prepare fn pointer*/ int (*xa_commit_entry)(/*_ XID *, int, long _*/); /*xa_commit fn pointer*/ int (*xa_recover_entry)(/*_ XID *, long, int, long _*/); /*xa_recover fn pointer*/ int (*xa_forget_entry)(/*_ XID *, int, long _*/); /*xa_forget fn pointer*/ int (*xa_complete_entry)(/*_ int *, int *, int, long _*/); /*xa_complete fn pointer*/ ; XA 라이브러리 ALTIBASE HDB XA 인터페이스를사용하는애플리케이션을 XA Interface 65

연결하기위해서는별도의라이브러리가필요하지않다. ODBC 프로그램을위한 odbccli 라이브러리에포함되어제공하기때문에, 사용자가 XA 관련기능을사용하기위해서는 XA 를사용하는애플리케이션에 libodbccli.a 라이브러리만링크하면된다. 66 API User s Manual

XA 인터페이스 XA 인터페이스는 RM 과 TM 간의상호인터페이스이다. TM 은글로벌트랜잭션을수행하기위해 RM 을제어하는 XA 루틴과 RM 이동적으로 TM 에게요청하는 AX 루틴으로구성된다. Note: ALTIBASE HDB 는동적인등록을지원하지않기때문에, 트랜잭션을시작하기전에 TM 이 RM 으로 xa_start 를호출해야한다. XA 함수 ALTIBASE HDB 는 xa_switch_t 의 ALTIBASE HDB 구현인 altibase_xa_switch 구조체에 XA 관련함수들을제공한다. XA 인터페이스 설명 xa_open Resource Manager 에연결한다. xa_close Resource Manager로부터연결을해제한다. xa_start 새로운트랜잭션브랜치또는기존의트랜잭션브랜치를다시시작하고, 주어진트랜잭션식별자 (XID) 와연계시킨다. xa_end 트랜잭션브랜치로부터분리한다. xa_rollback 주어진 XID와연계된트랜잭션브랜치를롤백한다. xa_prepare 트랜잭션브랜치의커밋을준비한다. xa_commit 트랜잭션브랜치를커밋한다. xa_recover prepare, 휴리스틱커밋또는휴리스틱롤백된트랜잭션의 XID 리스트를보여준다. xa_forget 휴리스틱하게완료된트랜잭션브랜치에대한정보를 RM에서폐기하도록한다. [ 표 5-1] XA 인터페이스 xa_open RM 에접속한다. int xa_open(char *xa_info, int rmid, long flags); xa_info 는 null-terminated 문자열로, 서버정보를포함하며최대길이는 256byte 이다. SQLDriverConnect 의인자와동일한포맷을가지며, 추가적으로 XA_NAME, XA_LOG_DIR 필드가존재한다. XA Interface 67

다른필드에대한자세한설명한 CLI User's Manual 의 SQLDriverConnect 함수를참조하기바란다. NAME=value;NAME=value;NAME=value; 예 ) DSN=127.0.0.1;UID=SYS;PWD=MANAGER ;XA_NAME=conn1 XA 파라미터 XA_NAME XA_LOG_DIR 설명 ALTIBASE HDB Embedded SQL 프로그램에서연결의식별자로사용되는이름이다. ALTIBASE HDB Embedded SQL로애플리케이션을작성할때이값을생략하면, 기본연결을사용하게된다. 만약 XA_NAME 속성에이름을명시했다면, SQL문수행시 AT 절에이이름을사용하면된다. ALTIBASE HDB XA 라이브러리에서발생한에러정보를로깅하는디렉터리를명시한다. 기본값은 ALTIBASE_HOME 환경변수가설정되었을경우 $ALTIBASE_HOME/trc이고, 그렇지않다면현재디렉터리다. [ 표 5-2] XA 인터페이스에추가된필드 rmid 는접속할서버의 ID 를기록하며, 아무값이나쓸수있다. 플래그 (flags) 는다음의값을사용할수있다. TMNOFLAGS xa_close 지정된 RM 과연결을종료한다. int xa_close(char *xa_info, int rmid, long flags); xa_info 는서버에대한정보를기록하는문자열로, 최대길이는 256byte 이다. Note: 연결이이미종료된것에대해 xa_close 가수행되어도, XA_OK 값이반환된다. 플래그 (flags) 는다음의값을쓸수있다. TMNOFLAGS xa_start 트랜잭션브랜치를시작한다. xid 는글로벌트랜잭션에대한식별자이다. int xa_start(xid *xid, int rmid, long flags); 플래그 (flags) 는다음의값을쓸수있다. 68 API User s Manual

TMRESUME 이전에 suspend 된트랜잭션브랜치를계속한다. TMNOWAIT xa_start 가차단될경우, 기다리지않고 XA_RETRY 값을반환한다. TMASYNC 비동기모드로트랜잭션브랜치를시작한다 (ALTIBASE HDB 는지원하지않음 ). TMNOFLAGS 다른플래그를지정하지않을경우반드시이값을지정해야한다. TMJOIN 존재하는트랜잭션브랜치에연결한다. xa_end 트랜잭션브랜치를끝낸다. int xa_end(xid *xid, int rmid, long flags); 플래그 (flags) 는다음의값을쓸수있다. TMSUSPEND 해당트랜잭션브랜치를 suspend 상태로변경하고종료한다. 이트랜잭션브랜치는 xa_start 에의해서다시계속될수있다. TMSUCCESS 성공적으로종료했다는것을나타내는것으로 TMSUSPEND 또는 TMFAIL 과같이사용될수없다. TMFAIL 비정상적으로종료했다는것을나타낸다. 이트랜잭션브랜치의상태는 roll-back only 로지정된다. TMSUCCES 또는 TMSUSPEND 와같이사용될수없다. xa_rollback 지정된트랜잭션브랜치에대해서수행한연산을롤백한다. int xa_rollback(xid *xid, int rmid, long flags); 플래그 (flags) 는다음의값을쓸수있다. TMASYNC xa_rollback 이비동기모드로동작하도록한다 (ALTIBASE HDB 는지원하지않음 ). XA Interface 69

TMNOFLAGS 다른플래그를지정하지않을경우반드시이값을지정해야 한다. xa_prepare 2 단계커밋프로토콜에서트랜잭션을커밋하거나롤백하기이전에수행한다. int xa_prepare(xid *xid, int rmid, long flags); 플래그 (flags) 는다음의값을쓸수있다. TMASYNC (ALTIBASE HDB 는지원하지않음 ) TMNOFLAGS 다른플래그를지정하지않을경우반드시이값을지정해야한다. 다음의값이리턴될수있다. XA_RDONLY 트랜잭션이 RM (DBMS) 의어떤데이타도변경하지않았을경우에반환된다. RM 에서수행된트랜잭션은커밋이나롤백이필요하지않다. XA_OK 정상적으로수행되었을경우에이값을반환한다. xa_commit 특정트랜잭션브랜치를커밋한다. int xa_commit(xid *xid, int rmid, long flags); 플래그 (flags) 는다음의값을쓸수있다. TMONEPHASE one phase commit 을수행할경우설정한다. TMNOFLAGS 다른플래그를지정하지않을경우반드시이값을지정해야한다. xa_recover RM 에서 prepare 상태로있는트랜잭션브랜치에해당하는 xid 의 목록을얻는다. 70 API User s Manual

int xa_recover(xid *xids, long count, int rmid, long flags); 리턴값은 xids 에반환되는 xid 의갯수이다. count 매개변수에는 xids 의사이즈를지정한다. 플래그 (flags) 는다음의값을쓸수있다. TMSTARTRSCAN 자세한설명은 XA Specification 문서를참고한다. TMENDRSCAN 자세한설명은 XA Specification 문서를참고한다. TMNOFLAGS 현재커서위치에서시작하여 XID 목록을반환한다. xa_forget 휴리스틱하게 (heuristically) 완료된트랜잭션을 ALTIBASE HDB 서버가관리하지않도록한다. int xa_forget(xid * xid, int rmid, long flags); 플래그 (flags) 는다음의값을쓸수있다. TMNOFLAGS 항상이값을지정한다. xa_complete 비동기모드의연산을수행할때해당연산이종료될때까지 대기한다. ALTIBASE HDB 에서는지원하지않으며, 항상오류 메시지를리턴한다. XA Interface 71

XA 사용 이절에서는 XA 환경에서 ODBC, Embedded SQL, JDBC 등을 사용하기위한기본적인절차를살펴본다. ODBC/XA 수행순서 1. xa_open 지정한서버에접속한다. 2. SQLAllocHandle ODBC 에연결하기위해서 connection 과 environment 핸들을생성한다. 3. SQLSetConnectAttr XA connection 을 connection 핸들에연결한다. 4. SQLConnect 실제연결은 xa_open 으로연결되었으므로, 이호출에서새로운접속을수행하지는않는다. 다만 SQLConnect 는 ODBC 에서 connection 의내부상태값을변경한다. 이과정을생략하면 DML 연산을수행할수없다. 5. xa_start 특정 XID 에대응하는트랜잭션브랜치를시작한다. 6. SQL 구문실행 SQLPrepare, SQLExecute 등의연산을수행한다. 만일여기에서 commit 문을실행한다면서버는에러메시지를반환한다. 7. xa_end 트랜잭션브랜치를종료한다. 8. xa_prepare 커밋을위해 prepare 를수행한다. 9. xa_commit 트랜잭션을커밋한다. 72 API User s Manual

10. SQLDisconnect ODBC 에서 connection 의내부상태를연결되지않은상태로변경한다. 그러나실제 XA 에의해서생성된연결은그대로유지된다. 11. xa_close xa 의연결을종료한다. SQLSetConnectAttr ODBC 애플리케이션이분산트랜잭션을사용할수있도록, SQLSetConnectAttr 을호출하여 XA connection 을 ODBC connection 에연결시킨다. XA 연결하기위해서는 SQLSetConnectAttr 에다음과같은매개변수를준다. SQLRETURN SQLSetConnectAttr (SQLHDBC SQLINTEGER SQLPOINTER SQLINTEGER hdbc, fattr, vparam, slen); fattr = ALTIBASE_XA_RMID hdbc 로지정한연결을 XA 연결로써사용하도록한다. XA 연결에대한자세한정보는 vparam 에다음의구조체포인터를지정하여설정한다. vparam xa_open 으로연결할때사용한 rmid 값을갖는다. rmid 를지정하지않고서버에 XA 연결을하려면다음의매개변수를사용한다. fattr = SQL_ATTR_ENLIST_IN_XA 지정한 hdbc 연결을마지막 XA 연결과맺는다. Embedded SQL XA_NAME 설정에따른프로그램작성방법 XA 프로그램을작성할때, 커서는한트랜잭션내에서만유효하다. 즉트랜잭션이시작한후에커서를열어야하고, 트랜잭션이커밋또는롤백되기전에커서를닫아야한다. 기본연결을사용한프로그램작성방법 XA Interface 73

기본연결을사용려면다음과같이 xa_open 의연결정보를가지는 xa_info 인자에 XA_NAME 필드를지정하지않은문자열을사용해야한다. DSN=127.0.0.1;UID=SYS;PWD=MANAGER 그리고 SQL 구문에서는다음예제처럼 AT 절을사용하지않아도된다. EXEC SQL UPDATE emp SET empno = 5; 한개이상의연결을사용하기위해 XA_NAME 을사용한프로그 램작성방법 Embedded SQL 프로그램에서명시적으로연결의이름을 사용하려면, xa_open 의연결정보를가지는 xa_info 인자에 XA_NAME=conn1 필드가포함된문자열을사용해야한다. 기본연결과한개이상의이름이명시된연결이있는프로그램을 작성하려면, 다음과같이한다. 연결이름이 conn1, conn2 로존재한다면 TM 의환경설정에서 open_string 은다음과같이 XA_NAME 을사용해서연결이름을 명시한다. DSN=127.0.0.1;UID=SYS;PWD=MANAGER;XA_NAME=conn1 DSN=127.0.0.1;UID=SYS;PWD=MANAGER;XA_NAME=conn2 DSN=127.0.0.1;UID=SYS;PWD=MANAGER 애플리케이션서버의서비스함수프로그램에서는아래처럼 AT 절을포함한 Embedded SQL 구문을작성한다. EXEC SQL AT conn1 UPDATE emp SET empno = 5; EXEC SQL AT conn2 UPDATE emp SET empno = 5; EXEC SQL UPDATE emp SET empno = 5; JDBC/XA 수행순서 ALTIBASE HDB 의 JDBC 드라이버가정의하는 XA 관련클래스는다음과같다. Altibase.jdbc.driver.ABXADataSource Altibase.jdbc.driver.ABXAResource Altibase.jdbc.driver.XID 사용자가직접사용하는클래스는 ABXADataSource 이다. 나머지는 JTA 인터페이스클래스를구현한클래스로사용자가직접사용할필요는없다. 74 API User s Manual

1. ABXADataSource 객체생성 ABXADataSource xadatasource = new ABXADataSource(); xadatasource.seturl(args[0]); xadatasource.setuser("sys"); xadatasource.setpassword("manager"); 2. XAConnection 객체생성 XAConnection 을 XADataSource 클래스의 getxaconnection 매소드를호출하여생성한다. XAConnection xaconnection = xadatasource.getxaconnection( SYS, MANAGER: ); 3. XAResource 객체생성 XAResource 를 XAConnection 클래스의 getxaresource 매소드를호출하여생성한다. XAResource xaresource = xaconnection.getxaresource(); 4. Connection 객체생성 SQL 을수행할커넥션을 XAConnection 클래스의 getconnection 매소드를호출하여생성한다. Connection conn1 = xaconnection.getconnection(); 5. XAResource 객체를이용하여 XA 함수실행 xa_start, xa_end 등의 XA 함수들은 XAResource 클래스의매소드를사용하여실행된다. xaresource.start(xid, XAResource.TMNOFLAGS); 6. Connection 객체를이용하여 SQL 구문수행 Statement stmt = conn.createstatement(); int cnt = stmt.executeupdate("insert into t1 values (4321)"); XA 트랜잭션제어 ALTIBASE HDB XA 환경에서트랜잭션을제어하는방법에대해설명한다. XA 라이브러리를사용할때는 commit 이나 rollback 구문을사용하여트랜잭션을처리하면안된다. 대신에 AP 는아래표의 TX 인터페이스를사용하여 TM 이트랜잭션을시작하거나종료하도록해야한다.. XA Interface 75

TM 은일반적으로 XA 인터페이스를사용해서트랜잭션을제어한다. TX 인터페이스 설명 tx_open RM에 logon한다. tx_close RM에서 logout한다. tx_begin 새로운트랜잭션을시작한다. tx_commit 트랜잭션을커밋한다. tx_rollback 트랜잭션을롤백한다. [ 표 5-3] TX 인터페이스 TX 인터페이스와 XA 인터페이스의호출흐름을살펴보면, 다음 그림과같다. AP tx_open tx_begin TM XA Interface xa_open xa_start tx_commit tx_close xa_end xa_prepare xa_commit xa_close xa_recover xa_commit (xa_rollback, xa_forget) ALTIBASE Native Calls [ 그림 5-2] TX 인터페이스와 XA 인터페이스의호출흐름도 TPM 애플리케이션은애플리케이션클라이언트가애플리케이션서버에서제공하는서비스를요청하는 client/server 구조로되어있다. 서비스란논리적인일의단위로써, ALTIBASE HDB 를 RM 으로사용하는경우에는 SQL 구문의집합으로구성된다고볼수있다. 예제 다음예제들은애플리케이션서버가 TPM 시스템에이미로그온 되었다고가정한예제이다. 애플리케이션서버에서트랜잭션시작하기 76 API User s Manual

애플리케이션서버에의해서트랜잭션이시작되는예제이다. Client: tpm_service( SERVICE1 ); Server: SERVICE1() <get service specific data> tx_begin(); EXEC SQL UPDATE...; tpm_service( SERVICE2 ); tx_commit(); <return service status back to the client> 애플리케이션클라이언트에서트랜잭션시작하기 애플리케이션클라이언트에의해서트랜잭션이시작되는예제이다. Client: tx_begin(); tpm_service( SERVICE1 ); tmp_service( SERVICE2 ); tx_commit(); Server: SERVICE1() <get service specific data> EXEC SQL UPDATE...; <return service status back to the client> SERVICE2() <get service specific data> EXEC SQL UPDATE...; <return service status back to the client> 기존애플리케이션을 TPM 애플리케이션으로변경 기존에작성되어있던애플리케이션 (Precompiler 또는 ODBCCLI) 을 ALTIBASE HDB XA 라이브러리를이용한 TPM (Transaction Performance Monitoring) 애플리케이션으로변경하기위해서는다음의절차를따라야한다. 1. 애플리케이션을 서비스 라는프레임워크 (framework) 구조로전환한다. 여기서프레임워크란애플리케이션클라이언트가애플리케이션서버에게 서비스 를요청하는구조를의미한다. 어떤 TPM 은 tx_open, tx_close 함수를사용할것을요구하고, 어떤 TPM 은묵시적으로 logon, logoff 를하기도한다. 2. 일반적인 connect 구문을 TPM 호환성이있는형태로 XA Interface 77

변경한다. 예를들어, Embedded SQL 프로그램의경우에는 EXEC SQL CONNECT 구문을 tx_open() 으로변경하고, ODBCCLI 에서는 SQLDriverConnect 구문을 tx_open 과 SQLConnect 로변경한다. 실제연결은 tx_open 으로연결되었으나, ODBC 내부에서 XA 연결과맺어주는 SQLConnect 과정을생략하면 DML 연산을수행할수없다. 자세한설명은 ODBC/XA 수행순서를참조한다. 3. 일반적인 disconnect 구문을 TPM 호환성이있는형태로변경한다. Embedded SQL 프로그램의 EXEC SQL DISCONNECT 또는 ODBCCLI 의 SQLDisconnect 구문을 tx_close() 로변경한다. 4. Commit, rollback 구문을 TPM 호환성이있는형태로변경한다. 예를들어 EXEC SQL COMMIT/ROLLBACK (Embedded SQL 프로그램 ), SQLEndTran(ODBCCLI) 을 tx_commit/tx_rollback 으로변경하고, tx_begin() 을호출하여트랜잭션을시작하도록한다. 5. 애플리케이션은트랜잭션을종료 (end) 하기전에 fetch 상태를리셋해야한다. 커서를사용해서 fetch 를했으면트랜잭션을종료하기전에 CLOSE RELEASE 를사용해서커서를닫고자원을해제해야한다. ALTIBASE HDB 구문 CONNECT 암묵적인트랜잭션시작 SQL COMMIT ROLLBACK DISCONNECT SET TRANSACTION READ ONLY TPM 함수 tx_open tx_begin SERVICE에서 SQL구문수행 tx_commit tx_rollback tx_close 허용하지않음 78 API User s Manual

XA 사용시제약사항 XA 를사용할때다음과같은몇가지제약사항이존재한다. SQL 사용시제약사항 트랜잭션브랜치관련제약사항 연계이주비지원 비동기호출비지원 동적등록비지원 서버종료 SQL 사용시제약사항 롤백과커밋 TM 이글로벌트랜잭션을관리하기때문에 XA 애플리케이션에서는 COMMIT 또는 ROLLBACK 구문같은트랜잭션제어구문을사용해서글로벌트랜잭션을제어해서는안된다. 글로벌트랜잭션을종료하기위해서는 tx_commit 이나 tx_rollback 을사용해야한다. Precompiler 애플리케이션에서 EXEC SQL ROLLBACK 이나 EXEC SQL COMMIT 구문을사용할수없다. ODBCCLI 애플리케이션에서도 SQLEndTran 을사용해서커밋이나롤백을수행하면안된다. DDL 구문 AUTOCOMMIT 세션프로퍼티 DDL SQL 구문은 ALTIBASE HDB 서버내부적으로커밋을하기 때문에 ALTIBASE HDB XA 애플리케이션에서사용할수없다. 글로벌트랜잭션은 non-autocommit 모드에서수행되기때문에, ALTER SESSION SET AUTOCOMMIT = TRUE 구문을사용하여 AUTOCOMMIT 프로퍼티를변경할수없다. SET TRANSACTION XA 애플리케이션에서 SET TRANSACTION READ ONLY READ WRITE ISOLATION LEVEL... 구문을사용하면안된다. XA Interface 79

EXEC SQL 구문으로연결또는해제 Embedded SQL 프로그램에서연결또는연결해제를위해서 EXEC SQL CONNECT, EXEC SQL DISCONNECT 구문을 사용해서는안된다. 트랜잭션브랜치관련제약사항 하나의글로벌트랜잭션에는다수의애플리케이션쓰레드들이참여하는데, 이들쓰레드는서로 tightly-coupled 또는 looselycoupled 관계일수있다. Tightly-coupled 관계는자원을공유하는쓰레드의관계이다. 이들쓰레드들은하나의개체로처리된다. Tightly-coupled 쓰레드에서 RM 은트랜잭션브랜치가자원의데드락이발생하지않도록해야한다. 그러나 Loosely-coupled 관계에서는이런보장을하지않는다. RM 에서는 loosely-coupled 관계의트랜잭션브랜치를서로다른글로벌트랜잭션처럼다룬다. XID 와쓰레드의관계 TM 이 XID 의 branch qualifier 를새로운값으로생성하여 RM 에전달한다면, 이쓰레드는같은브랜치안의다른쓰레드들과 loosely-coupled 관계가된다. RM 은이쓰레드를별도의글로벌트랜잭션처럼처리한다. 그리고만약 TM 이 XID 의 branch qualifier 를재사용한다면, 이쓰레드는해당브랜치를공유하는다른쓰레드들과 tightly-coupled 한관계가된다. RM 은이러한 tightly-coupled 쓰레드들을하나의개체처럼다뤄야하고, 이들 tightly-coupled 쓰레드간에자원데드락이발생하지않도록보장해야한다. 연계이주비지원 ALTIBASE HDB 는연계이주 (Association Migration, TM 이 suspended 브랜치를다른브랜치에서연계하여다시시작하는것 ) 를지원하지않는다. 80 API User s Manual

비동기호출비지원 ALTIBASE HDB 는비동기 XA 호출을지원하지않는다. 동적인등록비지원 ALTIBASE HDB 서버는동적등록을지원하지않고, 정적등록만지원한다. 동적등록 (Dynamic Registration) 이란 RM 이글로벌트랜잭션을시작하기전에자신이 TM 에등록하는것을말한다. 정적등록에서는 TM 이 xa_start 를꼭호출하여트랜잭션시작을 RM 에알려야한다. 서버종료 Shutdown abort 를사용한 ALTIBASE HDB 종료또는비정상종료시 prepared 트랜잭션이존재하였다면, 종료후서버재구동시이들트랜잭션이 recovery 과정을거치게되므로구동후에 xa_recover 를통해서이들트랜잭션을처리할수있다. Shutdown immediate 또는 shutdown normal 로서버를종료할때 prepared 트랜잭션이존재하면, 정상종료를명령했더라도 ALTIBASE HDB 는 abort 로종료시킬때와같은방식으로서버를종료한다. 따라서재구동시 recovery 과정을거쳐이들트랜잭션이그대로유지되며 xa_recover 를통해서이들트랜잭션을처리할수있다. 그러나 prepared 트랜잭션이존재하지않을경우에는정상종료하며, 다음구동시 recovery 과정을거치지않게된다. XA Interface 81

JDBC 분산트랜잭션 분산트랜잭션을구현한 ALTIBASE HDB JDBC 는 JDBC 2.0 extension API 에서 Connection Pooling 기능과분산트랜잭션을위한 Open XA 표준을준수한다. XA 표준에부합하는분산트랜잭션기능을구현한모든클래스는 ALTIBASE HDB JDBC 드라이버패키지에기본으로포함되어제공된다. JTA(Java Transaction API) 와애플리케이션서버 분산트랜잭션에서애플리케이션이애플리케이션서버를통해서 트랜잭션을수행하는과정을그림과같이설명한다. Application Application Server Transaction Manager Resource Adapter [ 그림 5-3] 분산트랜잭션과정 애플리케이션서버는각각의자원들과연결될수있는 XAConnection 을지원한다. 애플리케이션은애플리케이션서버에접속해서 Connection 을얻어쿼리를수행한다. 그리고애플리케이션서버는 TM (Transaction Manager) 을통해트랜잭션을관리한다. 이때 TM 은 DBMS 벤더에서제공하는 Resource Adapter 를이용해서자원에접근할수있다. Resource 가 DBMS 일경우, Resource Adapter 는 JDBC 드라이버패키지가될수있다. Resource Adapter 는 ResourceFactory, Transactional Resource(XAConnection), Connection, XAResource 등 4 가지종류의클래스로구성된다. ResourceFactory 는 XAConnection 을생성하며, JDBC 스펙에서 XADataSource 가여기에해당한다. 애플리케이션서버는 XADataSource 에서가져온 XAConnection(DBMS 로연결 ) 을얻는다. 그리고 XAConnection 은애플리케이션에서사용할 connection(java.sql.connection) 인스턴스와 TM 에서사용할 XAResource 인스턴스를얻어온다. 82 API User s Manual

XA 컴포넌트 XADataSource Interface JDBC 2.0 Optional 패키지의표준 XA 인터페이스들과이를 구현한 ALTIBASE 클래스를설명한다. javax.sql.xadatasource 는 XA Connection 의 factory 기능을 갖는인터페이스이다. 이인터페이스의 getxaconnection 메소드가 XA Connection 인스턴스를반환한다. public interface XADataSource XAConnection getxaconnection() throws SQLException; XAConnection getxaconnection(string user, String password) throws SQLException;... Altibase.jdbc.driver.ABXADataSource 는 ALTIBASE HDB 에서제공한 JDBC 드라이버에존재하는 XADataSource 인터페이스를구현한클래스이다. 동시에 Altibase.jdbc.driver.ABConnectionPoolDataSource 를상속한클래스이다. ABConnectionPoolDataSource 클래스는 Altibase.jdbc.driver.DataSource 를상속한다. 따라서, ABXADataSource 클래스는 DataSource 와 ABConnectionPoolDataSource 의 connection properties 를모두포함한다. DataSource <Interface> XADataSource ABConnectionPoolDataSource ABXADataSource [ 그림 5-4] ABXADataSource 클래스 ABXADataSource 클래스의 getxaconnection 메소드는 XAConnection 타입의인스턴스를반환한다. 이인스턴스는실제로 ABPooledConnection 클래스의인스턴스로서 XA Interface 83

ABPooledConnection 클래스는 XAConnection 인터페이스를구현하고있다. XA data source 는 Java Naming Directory 와 Interface(JNDI) 에등록및사용할수있다. XAConnection Interface XAConnection 인터페이스는 PooledConnection 인터페이스의 하위인터페이스이다. getconnection, close, addconnectioneventlistener, removeconnectioneventlistener 메소드를포함한다. public interface XAConnection extends PooledConnection javax.jta.xa.xaresource getxaresource() throws SQLException; XAConnection 의인스턴스는데이타베이스와물리적으로연결하고있다. 또한 XAConnection 인스턴스를통해분산트랜잭션을관리하는데사용되는 XAResource 를얻을수있다. ALTIBASE HDB JDBC driver 에서는 Altibase.jdbc.driver.ABPooledConnection 클래스의인스턴스가실질적인 XAConnection 타입의인스턴스가된다. ABPooledConnection 클래스의 getxaresource 메소드는 ABXAResource 인스턴스를반환하고, getconnection 메소드는 ABConnection 인스턴스를반환한다. <Interface> PooledConnection <Interface> XAConnection ABPooled Connection [ 그림 5-5] ABPooledConnection 클래스 84 API User s Manual

getconnection 메소드를통해반환되는 ABConnection 인스턴스는데이타베이스와의물리적인연결에대한임시핸들이고, 이 Connection 은글로벌트랜잭션에참여되기까지는일반적인 Connection 처럼동작한다. 글로벌트랜잭션에참여되는순간에 auto-commit 상태는 false 가되며, 글로벌트랜잭션이끝난후에 auto-commit 상태는글로벌트랜잭션이시작되기이전상태로돌아간다. XAConnection 의 getconnection 메소드가호출될때마다새로운 Connection 인스턴스를반환하는데, 동일한 XAConnection 인스턴스에의해반환되어이전에존재하던 Connection 인스턴스는 close 된다. 그럼에도불구하고, 새로운 Connection 이오픈되기전에이전의 Connection 은명시적으로 close 하기를권장한다. XAConnection 인스턴스의 close 메소드가호출되면데이타베이스로의물리적인연결이끊어진다. XAResource Interface TM 은모든트랜잭션브랜치들을조정하기위해서 ABXAResource 인스턴스를사용한다. Altibse.jdbc.driver.ABXAResource 타입의인스턴스는 javax.transaction.xa.xaresource 인터페이스를구현하는클래스의인스턴스이다. <Interface> javax.transaction.xa.xaresource ABXAResource [ 그림 5-6] ABXAResource 클래스 Altibase JDBC driver 는 ABPooledConnection 클래스의 getxaresource 메소드를호출할때마다 ABXAResource 인스턴스를생성하여반환하고, Altibase JDBC driver ABXAResource 인스턴스와 connection 인스턴스를연결시킨다. 트랜잭션브랜치는이 connection 으로동작한다. ABXAResource 클래스는분산된트랜잭션의트랜잭션브랜치를조정하기위해몇개의메소드를갖고있다. XA Interface 85

TM 은애플리케이션서버와같은중간층의컴포넌트로부터 ABXAResource 인스턴스를받으며, 아래의메소드를갖고있다. void start(xid xid, int flags) void end(xid xid, int flags) int prepare(xid xid) void commit(xid xid, boolean onephase) void rollback(xid xid) public void forget(xid xid) public Xid[] recover(int flag) 자세한내용은 java API Spec. 의 javax.transaction.xa.xaresource 를참조하기바란다. Xid interface TM 은트랜잭션 ID 인스턴스를생성하고, 분산트랜잭션의브랜치를관리하는데이를사용한다. 각각의트랜잭션브랜치는유일한트랜잭션 ID 를부여받으며, 다음의정보를포함한다. Format identifier Global transaction identifier Branch qualifier Altibase 는 javax.transaction.xa.xid 인터페이스를구현한클래스가 Altibase.jdbc.driver 패키지에 XID 클래스로존재한다. Note: ABXAResource 호출에는 Altibase.jdbc.driver.XID 를반드시사용할필요는없다. 여기에는 javax.transaction.xa.xid 인터페이스를구현한어떤클래스도사용될수있다. 에러처리 XA 관련메소드는에러가발생할때, ABXAException 을 throw 한다. ABXAException 클래스는 javax.transaction.xa.xaexception 클래스의하위클래스이다. 애플리케이션서버에서 XA 설정 WebLogic 에서 XA 설정 1. 웹로직콘솔에서 Services -> JDBC -> Connection Pools 에서 Configure a new JDBC Connection Pool 을선택한후 JDBC 연결정보를입력한다. ([ 그림 6-6]JDBC 연결정보입력참조 ) 86 API User s Manual

구분 NON-XA XA URL jdbc:altibase://[ip]:[port]/dbnam e jdbc:altibase://[ip]:[port]/dbnam e Driver Classname Altibase.jdbc.driver.AltibaseDriv er Altibase.jdbc.driver.ABXADataS ource Properties User=[username] User=[username] [ 표 5-4] NON-XA와 XA의연결정보비교 [ 그림 5-7] JDBC 연결정보입력 2. 생성된 Connection Pool 을이용해서 DataSource 를만든다. Services->JDBC->Data Sources 에서 Configure a new JDBC Data Source 를선택한다. Name 과 JNDI Name 을입력하고 Honor Global Transactions 에체크한다. 다음페이지에서 PoolName 에앞서만든 Pool 의이름을입력한다. (weblogic 8.1) ([ 그림 6-7] 데이타소스생성참조 ) Note: weblogic8.1 이전버전에서는 Services->JDBC->XA Data Sources 에서새로운 DataSource 를생성한다. XA Interface 87

[ 그림 5-8] 데이타소스생성 Weblogic 애플리케이션예제 JEUS 에서 XA 설정 // step 1. JNDI Lookup and get UserTransaction Object Context ctx = null; Hashtable env = new Hashtable(); // Parameter for weblogic env.put(context.initial_context_factory, "weblogic.jndi.wlinitialcontextfactory"); env.put(context.provider_url,"t3://localhost:7001"); env.put(context.security_principal,"weblogic"); env.put(context.security_credentials,"weblogic"); ctx = new InitialContext(env); System.out.println("Context Created :"+ctx); // step 2. get User Transaction Object UserTransaction tx = (UserTransaction)ctx.lookup("javax.transaction.UserTransa ction"); // step 3 start Transaction System.out.println("Start Transaction :"+tx); tx.begin(); try // step 4. doing query // step 4-1. get Datasource DataSource xads1 = (DataSource)ctx.lookup("altiTXDS"); 제우스에서 JDBC 데이타소스를생성하기위한기본설정을한다. 88 API User s Manual