OCI 애플리케이션에서 DRCP 확장성 활용

개요

오라클 데이터베이스에서 DRCP(Database Resident Connection Pooling)는 데이터베이스 서버 프로세스 수를 줄여 애플리케이션 확장성을 향상시키는 기술입니다. OCI(Oracle Call Interface) 애플리케이션에서 DRCP를 활용하면 클라이언트 측 연결 풀링만 사용하는 것에 비해 몇 가지 중요한 이점을 얻을 수 있습니다. 이 글에서는 OCI 애플리케이션에서 DRCP를 구성하고 사용하는 방법, 그리고 성능 개선 효과를 실질적인 예시와 함께 자세히 설명합니다.

DRCP의 이점

  • 서버 자원 절약: 데이터베이스 서버 프로세스 수가 줄어들어 CPU, 메모리 등 서버 자원 사용량이 감소합니다.
  • 확장성 향상: 서버 자원 제약으로 인해 제한되었던 연결 수가 증가하여 더 많은 동시 사용자 지원이 가능합니다.
  • 성능 개선: 데이터베이스 연결 및 해제 오버헤드가 줄어들어 애플리케이션 응답 시간이 단축됩니다.

OCI 애플리케이션에서의 DRCP 구성

OCI 애플리케이션에서 DRCP를 사용하려면 다음 단계를 따라야 합니다.

1. 데이터베이스 측 DRCP 활성화

먼저 데이터베이스 서버에서 DRCP를 활성화해야 합니다. SYSDBA 권한을 가진 사용자로 접속하여 다음 명령을 실행합니다.

EXEC DBMS_CONNECTION_POOL.START_POOL();

필요에 따라 풀 크기, 시간 제한 등의 DRCP 설정을 변경할 수 있습니다. 자세한 내용은 오라클 문서를 참조하십시오.

2. 서비스 생성 및 속성 설정

RAC 환경이 아니라면, 서비스 생성은 필수가 아닙니다. RAC 환경에서는 DRCP와 연결할 서비스 생성 및 속성 설정이 필요합니다.

EXEC DBMS_SERVICE.CREATE_SERVICE(service_name => 'mydrcpservice', network_name => 'mydrcpservice');
EXEC DBMS_SERVICE.START_SERVICE('mydrcpservice');
EXEC DBMS_SERVICE.MODIFY_SERVICE(service_name => 'mydrcpservice', drcp => TRUE);

3. OCI 연결 문자열 수정

OCI 애플리케이션에서 데이터베이스에 접속하는 연결 문자열을 수정하여 DRCP를 사용하도록 지정해야 합니다. 예를 들어, Easy Connect 문자열을 사용하는 경우 다음과 같이 서비스 이름을 포함합니다.

username/password@//host:port/mydrcpservice

TNSNames.ora 파일을 사용하는 경우, TNS 항목에 (SERVER=POOLED) 속성을 추가합니다.

MYDB = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = host)(PORT = port))
  (CONNECT_DATA = (SERVER = POOLED)(SERVICE_NAME = mydrcpservice))
 )

4. OCI 코드 수정 (DRCP 서비스 연결)

OCI 애플리케이션 코드에서 OCIAttrSet() 함수를 사용하여 OCI_ATTR_PURITY 속성을 OCI_ATTR_PURITY_SELF 로 설정해야 합니다. 이는 연결이 풀링되어 재사용될 때 세션 상태가 유지되지 않도록 하기 위함입니다. 또한, OCI 세션을 획득할 때 OCI_SESSGET 모드를 사용해야 합니다.

OCIEnv *envhp;
OCISvcCtx *svchp;
OCIError *errhp;
OCISession *sessp;

sword status = OCISessionGet(envhp, errhp, svchp, (OCISession **) &sessp, (OraText*) NULL, 0, OCI_SESSGET, (OCIAuthInfo*) NULL);

// 세션 속성 설정 (퓨리티 설정)
OCIAttrSet((dvoid*)sessp, OCI_HTYPE_SESSION, (dvoid*)OCI_ATTR_PURITY_SELF, (ub4)0, OCI_ATTR_PURITY, errhp);

예시 코드 및 결과

다음은 DRCP를 사용하는 OCI 애플리케이션의 간단한 예시 코드입니다.

“`c #include <stdio.h> #include <stdlib.h> #include <oci.h> #define USERNAME “your_username” #define PASSWORD “your_password” #define CONNECT_STRING “//host:port/mydrcpservice” int main() { OCIEnv *envhp = NULL; OCIError *errhp = NULL; OCISvcCtx *svchp = NULL; OCISession *authp = NULL; OCIServer *srvhp = NULL; OCILogon(envhp, errhp, &svchp, USERNAME, strlen(USERNAME), PASSWORD, strlen(PASSWORD), CONNECT_STRING, strlen(CONNECT_STRING)); /* 세션 퓨리티 설정 */ OCIAttrSet((dvoid*)authp, OCI_HTYPE_SESSION, (dvoid*)OCI_ATTR_PURITY_SELF, (ub4)0, OCI_ATTR_PURITY, errhp); printf(“Connected to Oracle Database using DRCP!\n”); OCILogoff(svchp, errhp); return 0; } “`

이 코드를 컴파일하고 실행하면 DRCP를 통해 데이터베이스에 접속되었음을 확인할 수 있습니다. V$SESSION 뷰를 조회하여 연결이 풀링되었는지 확인할 수 있습니다.

성능 측정

DRCP 적용 전후의 성능을 비교하기 위해 애플리케이션의 응답 시간, 데이터베이스 서버 프로세스 수 등을 측정합니다. AWR (Automatic Workload Repository) 보고서와 V$SYSSTAT 뷰를 활용하여 성능 데이터를 수집할 수 있습니다.

주의사항

  • DRCP는 세션 상태 유지가 필요 없는 애플리케이션에 적합합니다.
  • DRCP 설정을 신중하게 조정하여 애플리케이션 요구 사항에 맞게 최적화해야 합니다.
  • RAC 환경에서 DRCP 사용시 서비스 구성이 중요합니다.

결론

OCI 애플리케이션에서 DRCP를 올바르게 구성하고 사용하면 데이터베이스 서버 자원을 효율적으로 활용하고 애플리케이션의 확장성과 성능을 개선할 수 있습니다. 제시된 예시와 가이드라인을 통해 DRCP를 성공적으로 적용하고 최적화할 수 있습니다.

위로 스크롤