CLI란 ISO/IEC 9075-3:2003에 정의된 소프트웨어 개발 표준이다.
CLI는 데이터베이스에 어떻게 SQL을 전달하고, 결과 값을 어떻게 받고 분석해야 하는지에 대한 함수 및 명세를 정의하고 있다. 이 CLI는 1990년 초창기에 개발되었고, C 와 COBOL언어 만을 위해 개발되었고, 현재까지 그 스펙은 유지되고 있다.
현재까지 가장 널리 알려진 표준 인터페이스는 ODBC(Open Database Connectivity)로서 클라이언트 프로그램이 데이터베이스의 종류와 무관하게 데이터베이스 접속할 수 있는 방법을 제시해 주고 있다. 현재 최신 ODBC API 버전은 3.52 로서 ISO와 X/Open 표준에 정의되어 있다.
표준 CLI 함수
표준 함수의 사용법에 대해서는 다음과 같은 링크를 참조한다.
다음의 함수를 참고하면 된다.
SQLAllocConnect | SQLDisconnect | SQLGetDescField | SQLPrepare |
SQLAllocEnv | SQLDriverConnect | SQLGetDescRec | SQLPrimaryKeys |
SQLAllocHandle | SQLExecDirect | SQLGetDiagRec | SQLStatistics |
SQLAllocStmt | SQLExecute | SQLGetEnvAttr | SQLRowCount |
SQLBindCol | SQLFetch | SQLGetFunctions | SQLSetConnectAttr |
SQLBindParameter+ | SQLFreeConnect | SQLGetInfo | SQLSetDescField |
SQLColAttribute | SQLFreeEnv | SQLGetStmtAttr | SQLSetDescRec |
SQLColumns | SQLFreeHandle | SQLGetTypeInfo | SQLSetEnvAttr |
SQLConnect | SQLFreeStmt | SQLNativeSQL | SQLSetStmtAttr |
SQLCopyDesc | SQLGetConnectAttr | SQLNumParams | SQLStatistics |
SQLDescribeCol | SQLGetData | SQLNumResultCols | SQLTables |
접속을 위한 연결 스트링
CLI를 통해 접속을 하기 위해서는 연결 스트링을 만들어야 하며, 각각의 내용은 다음과 같다.
연결 스트링 항목명 | 항목 설명 |
---|---|
DSN | 데이터 소스 명을 지정한다. ODBC에서는 리소스가 담긴 파일의 섹션 명을 기술하고, CLI에서는 서버명 혹은 IP 주소를 지정한다. |
DBNAME | InfiniFlux의 DB명을 기술한다. |
SERVER | InfiniFlux가 위치하는 서버의 호스트 명 혹은 IP 주소를 가리킨다. |
NLS_USE | 서로 사용할 언어 종류를 설정한다.(현재 사용되지 않으며, 차후에 확장용으로 보존된다) |
UID | 사용자 아이디 |
PWD | 사용자 패스워드 |
PORT_NO | 접속할 포트 번호 |
PORT_DIR | 유닉스에서 Unix domain으로 접속할 경우 사용되는 파일 패스를 지정한다. (서버에서 수정했을 경우에 지정하며, 디폴트로는 지정하지 않아도 동작한다.) |
CONNTYPE | 클라이언트와 서버의 접속 방법을 지정한다. 1: TCP/IP INET 으로 접속 2 : TCP/IP Unix Domain 으로 접속 |
COMPRESS | Append 프로토콜을 압축할 것인지 나타낸다. 이 값이 0일 경우에는 압축하지 않고 전송한다. 이 값이 0보다 큰 임의의 값일 경우에는 그 값보다 Append 레코드가 클 경우에만 압축한다. 예) COMPRESS=512 레코드 사이즈가 512보다 클 경우에만 압축하여 동작한다. 원격 접속일 경우 압축하면 전송 성능이 향상된다. |
SHOW_HIDDEN_COLS | 숨겨진 컬럼인 (_arrival_time)을 select * 로 수행시 보여줄 것인지 결정한다. 0일 경우에는 보이지 않으며, 1일 경우에 해당 컬럼의 정보가 출력된다. |
CONNECTION_TIMEOUT | 최초 연결시에 얼마나 대기할 것이지 설정한다. 디폴트로는 30초가 설정되어 있다. 만일 최초 연결시 서버의 응답이 30초 보다 더 느려지는 경우를 고려하면, 이 값을 더 크게 설정한다. |
CLI 접속 예제는 다음과 같다.
sprintf(connStr,"DSN=127.0.0.1;COMPRESS=512;UID=SYS;PWD=MANAGER;CONNTYPE=1;PORT_NO=%d", MACHBASE_PORT_NO); if (SQL_ERROR == SQLDriverConnect( gCon, NULL, (SQLCHAR *)connStr, SQL_NTS, NULL, 0, NULL, SQL_DRIVER_NOPROMPT ))
확장 CLI 함수 (APPEND)
CLI 확장 함수는 InfiniFlux 서버에 데이터를 초고속으로 입력하기 위해 제공되는 Append 프로토콜을 구현하기 위한 함수이다.
이 함수는 크게 4가지의 함수로 구성되어 있는데, 채널의 오픈, 채널에 대한 데이터 입력, 채널의 플러쉬, 채널 클로징이다.
Append 프로토콜의 이해
InfiniFlux에서 제공하는 Append 프로토콜은 비동기 방식으로 동작한다. 비동기라 함은 클라이언트가 서버에게 요청한 특정 작업에 대한 응답이 서로 완전히 동기화되지 않고, 임의의 이벤트가 발생하는 순간에 발생하는 것을 의미한다. 즉, 클라이언트가 Append를 수행했다고 하더라도, 그 수행에 대한 결과를 바로 얻거나 확인할 수 없으며, 서버에서 준비가 되는 임의의 시점에 그것을 확인할 수 있다는 것이다. 이런 이유로 Append 프로토콜을 활용해서 응용 프로그램을 개발하는 개발자는 다음과 같은 내부 동작에 대한 이해를 가져야 한다. 이후의 설명은 클라이언트가 언제 어떻게 서버에서 발생하는 비동기 에러를 검출하고 사용자에게 되돌여주는지에 대한 것이다.
Append 데이터의 전송
SQLExecute 혹은 SQLExecDirect()와 같은 일반적인 호출에서 InfiniFlux는 즉시 그 결과를 클라이언트에게 되돌려주는 동기화 방식을 사용한다. 그러나, SQLAppendDataV2()는 사용자 데이터가 입력된 이후 즉시 요청을 보내지 않는다. 대신, 클라이언트 통신 버퍼가 모두 찰 때 까지 대기하고 있다가 모두 차면 그 이후에 한꺼번에 데이터를 클라이언트로 전송하게 된다. 이렇게 설계된 이유는 Append를 사용하는 클라이언트의 입력 데이터가 초당 수만에서 수십만 레코드를 가정하였기 때문에 고속의 데이터 전송을 위한 버퍼링 방식을 활용한 것이다. 이런 이유로 만일 사용자가 임의로 해당 버퍼의 내용을 전송하고자 할 경우에는 SQLAppendFlush() 함수 호출하여, 명시적으로 데이터를 입력할 수 있다.
Append 데이터의 에러 확인
앞에서 언급한 바와 같이 Append 프로토콜은 버퍼링되어 비동기로 동작한다. 특히, 서버에서 에러가 발생하지 않았을 경우에는 아무런 응답을 받지 않고, 에러가 발생했을 경우에만 에러를 검출하는 방식을 취하기 때문에 에러가 언제 어떻게 검출되는지 이해하는 것이 매우 중요하다. 또한, 에러를 검출하는 비용이 상대적으로 매우 크기 때문에 레코드 입력시마다 매번 검사하는 매우 비효율적으로 판단되어, 현재 InfiniFlux에서는 명시적으로 다음과 같은 경우에만 에러를 검출하도록 되어 있다. 에러가 검출될 경우에는 사용자가 설정한 에러 콜백 함수를 매번 호출하게 된다.
전송 버퍼가 모두 차고, 서버에게 명시적으로 데이터를 전송한 이후 검사
SQLAppendFlush() 내부에서 서버에게 명시적으로 데이터를 전송한 이후 검사
SQLAppendClose() 내부에서 종료 직전에 검사
즉, 기본적으로 위의 3가지 경우에만 에러를 검출하도록 되어 있어, I/O의 발생을 최소화하도록 설계되었다.
서버 에러 검사를 위한 부가 옵션
성능을 최대한으로 달성하기 위해 기본적으로 설정된 에러 검출 기법은 사용자가 원하는 경우 좀 더 빈번하게 검사하고, 이를 활용할 수 있다. 즉, SQLAppendOpen() 함수의 마지막 인자인 aErrorCheckCount를 조절함으로서 가능한다. 이 값이 0일 경우에는 별도의 확인 동작을 하지 않고, 기본으로 동작한다. 그러나, 만일 이 값이 0보다 클 경우에는 SQLAppendData()의 호출 횟수 마다 명시적으로 에러를 검사하도록 되어있다. 다시 말해 이 값이 10일 경우에는 10번의 Append 동작마다 에러를 검사하는 비용을 지불한다. 따라서, 이 값이 작을 경우에는 에러 검출을 위한 시스템 리소스를 많이 사용하기 때문에 적절한 숫자로 조절하여 사용해야 한다.
서버 에러 발생시 Trace 로그 남기기
만일 에러가 발생한 Append 데이터에 대해서 별도로 Trace 로그를 남기고자 할 경우에는 서버에 준비된 프로퍼티 DUMP_APPEND_ERROR 를 1로 설정한다. 이렇게 설정하면, iflux.trc 파일에 해당 에러를 발생시킨 레코드에 대한 명세가 파일로 기록된다. 단, 에러의 횟수가 과도할 경우 시스템 리소스의 사용량이 급격히 늘어나, InfiniFlux의 전체 성능을 떨어뜨릴 수 있으므로 주의하여 사용해야 한다.
APPEND 함수 설명
추가 중입니다 (많네요...)