1. C/C++ 외부 프로시저 소개#
이 장에서는 C/C++ 외부 프로시저 및 함수(이하 C/C++ 외부 프로시저 또는 외부 프로시저)를 소개한다. 외부 프로시저가 필요한 경우를 소개하고, Altibase 외부 프로시저의 특징에 대해 살펴본다.
C/C++ 외부 프로시저란?#
C/C++ 외부 프로시저(external procedures)란 C 또는 C++ 언어로 작성되고 컴파일되어 동적 링크 라이브러리(Dynamic Link Library, DLL)에 저장된 함수이다. 외부 프로시저는 Altibase의 외부 프로시저 객체를 통해 실행될 수 있으며, 실행 방법은 SQL 문 또는 응용 프로그램 내에서 저장 프로시저를 호출하는 것과 동일하다.
특징#
Altibase가 제공하는 외부 프로시저는 external mode와 internal mode가 있으며, 아래와 같은 특징 및 장점이 있다.
공통#
-
C/C++ 외부 프로시저 바디의 구현과 프로시저 호출 스펙이 서로 연관이 없으므로, C/C++ 외부 프로시저 바디를 수정해도 프로시저를 호출하는 프로그램은 수정할 필요가 없다.
-
기존의 PSM(저장 프로시저)이 지원하지 않는 C/C++ 언어만의 기능을 사용할 수 있다.
-
일부 연산 집약적인 작업은 C 언어와 같은 저수준 프로그래밍 언어로 작성할 때 가장 효율적으로 실행된다.
-
기존에 작성되어 있는 C/C++ 함수를 외부 프로시저화 하는 것만으로 PSM에서 직접 호출할 수 있다. 즉, 한 번 작성한 C/C++ 함수의 재사용이 가능하여 개발 비용을 줄일 수 있다.
External mode#
- C/C++ 외부 프로시저의 실행과 Altibase 서버 프로세스가 분리되어 있기 때문에, 사용자가 작성한 C/C++ 외부 프로시저에 문제가 있어도 데이터베이스에 영향을 주지 않는다.
Internal mode#
- Altibase 서버 프로세스가 직접 외부 프로시저를 호출하기 때문에, 사용자가 작성한 C/C++ 외부 프로시저에 결함이 있는 경우 서버가 비정상 종료할 수 있다.
- 사용자가 작성한 C/C++ 외부 프로시저에서 할당한 메모리를 해제하지 않으면 메모리 누수가 발생할 수 있다.
- 따라서 사용자가 작성한 C/C++ 외부 프로시저에 문제가 없도록 충분한 테스트가 필요하다.
외부 프로시저 호출 흐름#
외부 프로시저는 저장 프로시저(Stored Procedure, PSM)와 마찬가지로 클라이언트 세션에서 호출할 수 있다. 아래는 외부 프로시저 생성에서 호출까지의 전반적인 흐름이다.
공통#
사용자가 C 또는 C++ 언어로 작성한 함수(Altibase가 지원하는 외부 프로시저 형식)를 동적 라이브러리로 만들어 Altibase가 식별할 수 있는 위치에 저장한 다음, SQL 구문을 이용해서 외부 프로시저 객체(외부 프로시저를 등록하는 저장 프로시저)를 생성한다.
External mode#
다음으로 클라이언트 세션에서 외부 프로시저를 등록한 저장 프로시저를 호출하면, Altibase 서버는 에이전트 프로세스를 시작한다.
에이전트 프로세스는 외부 프로시저와 관련된 동적 라이브러리 파일을 로딩하고 라이브러리 내의 관련 C/C++ 함수를 실행하여 결과를 Altibase 서버로 전달하면 Altibase 서버가 클라이언트에 그 결과를 반환한다.
Internal mode#
클라이언트 세션에서 외부 프로시저를 등록한 저장 프로시저를 호출하면, Altibase 서버는 해당 함수를 호출한다. 외부 프로시저를 등록한 저장 프로시저를 생성할 때 또는 compile 할 때 사용자가 작성한 C/C++ 외부 프로시저를 포함하는 동적 라이브러리를 로드한다. 동일한 동적 라이브러리를 사용하는 외부 프로시저를 여러 개 생성하면, 동적 라이브러리를 한 번만 로드하고 참조 회수를 1씩 증가시킨다.
외부 프로시저를 제거하거나 재생성하면 동적 라이브러리 참조 회수를 감소시키며, 동적 라이브러리를 참조하는 외부 프로시저가 없으면 동적 라이브러리 파일을 언로드한다. 동적 라이브러리를 참조하는 외부 프로시저의 개수는 V$LIBRARY를 통해서 확인할 수 있다.
아래는 클라이언트가 호출한 external mode의 외부 프로시저가 에이전트 프로세스를 통해 실행되는 흐름을 도식화한 그림이다.
[그림 1‑1] 외부 프로시저 호출 및 수행 흐름도
에이전트 프로세스#
에이전트 프로세스는 외부 프로시저용 C/C++ 함수가 저장된 DLL 파일을 불러오고 그 안의 함수를 실행하기 위해서 Altibase 서버가 별도로 생성하는 프로세스이다.
클라이언트 세션에서 외부 프로시저를 등록한 저장 프로시저를 호출하면 Altibase 서버가 외부 프로시저용 에이전트 프로세스(Agent Process)를 시작한다. 그리고 외부 프로시저의 수행이 완료되면, Altibase 서버는 잠시 대기한 후 다른 외부 프로시저의 수행이 없다면 에이전트 프로세스를 종료한다.
에이전트 프로세스는 Altibase 서버의 서비스 세션에 종속되어 있기 때문에, n개의 클라이언트 세션에서 외부 프로시저를 호출하는 경우 n개의 에이전트 프로세스가 생성된다. 그리고 세션이 종료하면 해당 세션이 생성한 에이전트 프로세스도 종료한다.
Internal mode는 에이전트 프로세스 없이 Altibase 서버에서 직접 동적 라이브러리를 로드하고 외부 프로시저를 실행한다.