싱글톤 파이프로 메시지 캐시
Singleton Pipe는 DBMS_PIPE
패키지에 추가되어 사용자 정의 메시지를 캐싱 및 검색하고 동시 읽기를 사용하여 여러 데이터베이스 세션에서 메시지를 공유할 수 있습니다.
싱글톤 파이프로 메시지 캐싱 정보
DBMS_PIPE
패키지는 싱글톤 파이프를 지원하기 위해 Autonomous Database에서 기능을 확장했습니다.
DBMS_PIPE
의 싱글톤 파이프:
-
싱글톤 파이프 메시지를 사용하여 사용자 데이터의 인메모리 캐싱을 제공합니다.
-
최대 32,767바이트의 사용자 정의 메시지를 캐시에 저장하고 검색하는 기능을 지원합니다.
-
동시 읽기를 사용하여 여러 데이터베이스 세션에서 캐시된 메시지 공유를 지원합니다. 이렇게 하면 처리량이 높아지고 데이터베이스 세션에서 동시에 메시지를 읽을 수 있습니다.
-
Read-Only 및 Read-Write 데이터베이스를 지원합니다.
-
다음과 같은 여러 캐시 무효화 방식을 지원합니다.
- 유저가 제어하는 명시적 캐시 무효화
- 유저가 지정한 시간 간격(초) 이후의 캐시 무효화 이 무효화 방법은 메시지 읽기가 아닌
shelflife
매개변수를 사용하여 메시지 발신자에 의해 제어됩니다. 이렇게 하면 읽기 장치가 캐시를 잘못 사용하므로 일반적인 위험을 방지할 수 있습니다.
표준 파이프 및 싱글톤 파이프 정보
DBMS_PIPE 패키지를 사용하면 두 개 이상의 데이터베이스 세션이 인메모리 메시지를 사용하여 통신할 수 있습니다. 파이프 기능에는 외부 서비스 인터페이스, 디버깅, 독립 트랜잭션 및 경보와 같은 여러 응용 프로그램이 있습니다. 자세한 내용은 DBMS_PIPE in Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 23ai PL/SQL Packages and Types Reference를 참조하십시오.

그림 database-pipe-messages-singleton-pipes.eps에 대한 설명
싱글톤 파이프는 지원되는 DBMS_PIPE
유형 중 하나일 수 있습니다.
- 암시적 파이프:
DBMS_PIPE.SEND_MESSAGE
함수를 사용하여 알 수 없는 파이프 이름으로 메시지를 보낼 때 자동으로 생성됩니다. - 명시적 파이프: 사용자가 지정한 파이프 이름과 함께
DBMS_PIPE.CREATE_PIPE
함수를 사용하여 생성됩니다. - 공용 파이프:
DBMS_PIPE
패키지에 대해EXECUTE
권한이 있는 모든 사용자가 액세스할 수 있습니다. - 전용 파이프: 파이프 작성자와 동일한 사용자가 있는 세션에서 액세스할 수 있습니다.
싱글톤 파이프는 Autonomous Database 인스턴스의 메모리에 단일 메시지를 캐시하는 기능을 제공합니다.
다음은 싱글톤 파이프를 사용하기 위한 일반적인 워크플로우를 보여줍니다.

그림 singleton-pipe-workflow.eps에 대한 설명
싱글톤 파이프 개요 및 피쳐
-
싱글톤 메시지
- 싱글톤 파이프는 파이프에서 하나의 메시지를 캐시에 저장할 수 있으므로 이름 "싱글톤"입니다.
- 싱글톤 파이프의 메시지는 최대 32,767바이트의 총 메시지 크기까지 여러 필드로 구성될 수 있습니다.
DBMS_PIPE
는DBMS_PIPE.PACK_MESSAGE
프로시저를 사용하여 메시지의 여러 속성을 압축하는 기능을 지원합니다.- 공용 싱글톤 파이프의 경우
DBMS_PIPE
패키지에 대한 실행 권한이 있는 데이터베이스 세션에서 메시지를 수신할 수 있습니다. - 개인 싱글톤 파이프의 경우 싱글톤 파이프 작성자와 동일한 사용자를 가진 세션에서 메시지를 수신할 수 있습니다.
- 읽기에 대한 높은 메시지 처리량
- 단일 파이프는 무효화되거나 제거될 때까지 파이프에 메시지를 캐시에 저장합니다. 데이터베이스 세션은 싱글톤 파이프에서 동시에 메시지를 읽을 수 있습니다.
- 싱글톤 파이프에서 메시지를 수신하는 것은 비차단 작업입니다.
- 메시지 캐싱
- 메시지는
DBMS_PIPE.SEND_MESSAGE
를 사용하여 싱글톤 파이프에 캐시됩니다. - 싱글톤 파이프에 캐시된 기존 메시지가 있는 경우
DBMS_PIPE.SEND_MESSAGE
는 싱글톤 파이프에서 하나의 메시지만 유지 관리하도록 이전 메시지를 덮어씁니다.
- 메시지는
- 메시지 무효화
- 명시적 무효화:
DBMS_PIPE.PURGE
프로시저를 사용하거나DBMS_PIPE.SEND_MESSAGE
를 사용하여 메시지를 겹쳐써 파이프를 비웁니다. - 자동 무효화: 지정된
shelflife
시간이 경과한 후 자동으로 메시지를 무효화할 수 있습니다.
- 명시적 무효화:
- 데이터베이스 메모리에서 축출되지 않음
- Singleton 파이프는 Oracle Database 메모리에서 축출되지 않습니다.
- 명시적 싱글톤 파이프는
DBMS_PIPE.REMOVE_PIPE
를 사용하여 제거되거나 데이터베이스가 다시 시작될 때까지 데이터베이스 메모리에 계속 상주합니다. - 암시적 싱글톤 파이프는 파이프에 캐시된 메시지가 하나 있을 때까지 데이터베이스 메모리에 유지됩니다.
싱글톤 파이프 작업
연산 | DBMS_PIPE 함수 또는 프로시저 |
---|---|
명시적 싱글톤 파이프 작성 |
|
싱글톤 파이프에서 메시지 캐시 |
Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 23ai PL/SQL Packages and Types Reference의 PACK_MESSAGE Procedures |
싱글톤 파이프에서 캐시된 메시지 읽기 |
RECIEVE_MESSAGE Function, UNPACK_MESSAGE Procedures in Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 23ai PL/SQL Packages and Types Reference |
싱글톤 파이프에서 메시지 삭제 |
Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 23ai PL/SQL Packages and Types Reference의 PURGE Procedure |
명시적 싱글톤 파이프 제거 |
Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 23ai PL/SQL Packages and Types Reference의 REMOVE_PIPE Function |
캐시 함수를 사용하여 캐시된 메시지 자동 새로 고침
DBMS_PIPE
패키지를 사용하면 사용자 정의 캐시 함수를 사용하여 싱글톤 파이프 메시지를 자동으로 채울 수 있습니다.
기본적으로 싱글톤 파이프 명시적 또는 암시적 무효화로 메시지가 무효화된 후 후속 DBMS_PIPE.RECEIVE_MESSAGE
에서 메시지가 수신되지 않습니다. 파이프에 새 메시지를 추가하려면 DBMS_PIPE.SEND_MESSAGE
를 호출하여 메시지를 명시적으로 캐시해야 합니다. 싱글톤 파이프에서 읽을 때 메시지를 사용할 수 없는 경우 이 경우를 방지하려면 캐시 함수를 정의할 수 있습니다. 캐시 함수를 정의하면 다음 시나리오에서 메시지를 받을 때 캐시 함수가 자동으로 호출됩니다.
- 싱글톤 파이프가 비어 있는 경우
shelflife
시간 경과로 인해 싱글톤 파이프의 메시지가 잘못된 경우입니다.
캐시 함수를 사용하려면 캐시 함수를 정의하고 cache_func
매개변수를 DBMS_PIPE.RECEIVE_MESSAGE
에 포함시킵니다. 사용자 정의 캐시 함수는 다음을 제공합니다.
- 캐시 함수는
DBMS_PIPE.RECEIVE_MESSAGE
를 사용하여 싱글톤 파이프에서 메시지를 읽을 때 지정할 수 있습니다. - 싱글톤 파이프에 메시지가 없으면
DBMS_PIPE.RECEIVE_MESSAGE
가 캐시 함수를 호출합니다. - 메시지
shelflife
시간이 경과하면 데이터베이스가 싱글톤 파이프에 새 메시지를 자동으로 채웁니다.
캐시 함수를 사용하면 싱글톤 파이프 작업을 간소화할 수 있습니다. 빈 파이프에서 메시지를 수신하기 위해 실패 사례를 처리할 필요는 없습니다. 또한 캐시 함수는 싱글톤 파이프에서 메시지를 읽을 때 캐시가 누락되지 않도록 하여 캐시된 메시지를 최대한 활용할 수 있도록 합니다.

그림 automatic-cache-refresh-cache-function.eps에 대한 설명
캐시 함수를 정의할 때 함수 이름은 소유자 스키마로 정규화되어야 합니다.
OWNER.FUNCTION_NAME
OWNER.PACKAGE.FUNCTION_NAME
다음 서명을 사용하여 캐시 함수를 정의합니다.
CREATE OR REPLACE FUNCTION cache_function_name(
pipename IN VARCHAR2
) RETURN INTEGER;
캐시 함수 내의 일반적인 작업은 다음과 같습니다.
DBMS_PIPE.CREATE_PIPE
를 사용하여 명시적 파이프에 대한 싱글톤 파이프를 작성합니다.- 싱글톤 파이프에 캐시할 메시지를 작성합니다.
- 캐시 함수에 지정된 파이프로 메시지를 보냅니다. 선택적으로 암시적 메시지에 대해
shelflife
를 지정합니다.
캐시 함수를 사용하려면 DBMS_PIPE.RECEIVE_MESSAGE
를 호출하는 현재 세션 사용자에게 캐시 함수를 실행하는 데 필요한 권한이 있어야 합니다.
캐시 함수 정의에 대한 자세한 내용은 RECIEVE_MESSAGE 함수를 참조하십시오.
명시적 싱글톤 파이프 작성
지정된 파이프 이름(명시적 싱글톤 파이프)을 사용하여 싱글톤 파이프를 작성하는 단계를 설명합니다.
먼저 이 예제에서 DBMS_PIPE.RECEIVE_MESSAGE
를 반복적으로 호출하는 receive_message
helper 함수를 생성합니다. 이렇게 하면 싱글톤 파이프 기능을 테스트할 수 있습니다.
CREATE OR REPLACE FUNCTION msg_types AS
TYPE t_rcv_row IS RECORD (c1 VARCHAR2(32767), c2 NUMBER);
TYPE t_rcv_tab IS TABLE OF t_rcv_row;
END;
CREATE OR REPLACE FUNCTION receive_message(
pipename IN VARCHAR2,
rcv_count IN NUMBER DEFAULT 1,
cache_func IN VARCHAR2 DEFAULT NULL)
RETURN msg_types.t_rcv_tab pipelined
AS
l_msg VARCHAR2(32767);
l_status NUMBER;
BEGIN
FOR i IN 1..rcv_count LOOP
l_status := DBMS_PIPE.RECEIVE_MESSAGE(
pipename => pipename,
cache_func => cache_func,
timeout => 1);
IF l_status != 0 THEN
raise_application_error(-20000,
'Message not received for attempt: ' || to_char(i) || ' status: ' ||
l_status);
END IF;
DBMS_PIPE.UNPACK_MESSAGE(l_msg);
pipe row(msg_types.t_rcv_row(l_msg));
END LOOP;
RETURN;
END;