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

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

그림 singleton-pipe-workflow.png에 대한 설명
싱글톤 파이프 개요 및 기능
-
싱글톤 메시지
-
싱글톤 파이프는 파이프에 하나의 메시지를 캐시할 수 있으므로 "싱글톤"이라는 이름을 지정할 수 있습니다.
-
싱글톤 파이프의 메시지는 최대 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시간이 경과한 후 자동으로 메시지를 무효화할 수 있습니다.
-
-
데이터베이스 메모리 축출 없음
-
싱글톤 파이프는 Oracle Database 메모리에서 제거되지 않습니다.
-
명시적 싱글톤 파이프는
DBMS_PIPE.REMOVE_PIPE를 사용하여 제거되거나 데이터베이스가 다시 시작될 때까지 데이터베이스 메모리에 계속 상주합니다. -
암시적 싱글톤 파이프는 파이프에 캐시된 메시지가 하나 있을 때까지 데이터베이스 메모리에 유지됩니다.
-
싱글톤 파이프 공정
| 연산 | DBMS_PIPE 함수 또는 절차 |
|---|---|
| 명시적 싱글톤 파이프 만들기 | CREATE_PIPE 함수 |
| 싱글톤 파이프에서 메시지 캐시 | Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 26ai PL/SQL Packages and Types Reference의 PACK_MESSAGE Procedures |
| 싱글톤 파이프에서 캐시된 메시지 읽기 | Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 26ai PL/SQL Packages and Types Reference의 RECEIVE_MESSAGE Function, UNPACK_MESSAGE Procedures |
| 싱글톤 파이프에서 메시지 삭제 | Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 26ai PL/SQL Packages and Types Reference의 PURGE Procedure |
| 명시적 싱글톤 파이프 제거 | Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 26ai PL/SQL Packages and Types Reference의 REMOVE_PIPE Function |
캐시 함수를 사용하여 캐시된 메시지 자동 새로 고침
DBMS_PIPE 패키지를 사용하면 사용자 정의 캐시 함수를 사용하여 싱글톤 파이프 메시지를 자동으로 채울 수 있습니다.
기본적으로 Singleton Pipe 명시적 또는 암시적 무효화로 메시지가 무효화된 후 후속 DBMS_PIPE.RECEIVE_MESSAGE는 메시지가 수신되지 않습니다. 파이프에 새 메시지를 추가하려면 DBMS_PIPE.SEND_MESSAGE를 호출하여 메시지를 명시적으로 캐시해야 합니다. 싱글톤 파이프에서 읽을 때 메시지를 사용할 수 없는 경우를 방지하기 위해 캐시 함수를 정의할 수 있습니다. 캐시 함수가 정의된 경우 다음 시나리오에서 메시지를 수신하면 캐시 함수가 자동으로 호출됩니다.
-
싱글톤 파이프가 비어 있는 경우
-
shelflife시간이 경과되어 싱글톤 파이프의 메시지가 부적합한 경우입니다.
캐시 함수를 사용하려면 캐시 함수를 정의하고 DBMS_PIPE.RECEIVE_MESSAGE에 cache_func 매개변수를 포함시킵니다. 유저 정의 캐시 함수는 다음을 제공합니다.
-
캐시 함수는
DBMS_PIPE.RECEIVE_MESSAGE를 사용하여 싱글톤 파이프에서 메시지를 읽을 때 지정할 수 있습니다. -
싱글톤 파이프에 메시지가 없으면
DBMS_PIPE.RECEIVE_MESSAGE가 캐시 함수를 호출합니다. -
메시지
shelflife시간이 경과하면 데이터베이스가 싱글톤 파이프에서 새 메시지를 자동으로 채웁니다.
캐시 함수를 사용하면 싱글톤 파이프 작업을 간소화할 수 있습니다. 빈 파이프에서 메시지를 수신하기 위해 실패 사례를 처리할 필요는 없습니다. 또한 캐시 함수를 사용하면 싱글톤 파이프에서 메시지를 읽을 때 캐시된 메시지를 최대로 사용할 수 있으므로 캐시 실패가 발생하지 않습니다.

그림 automatic-cache-refresh-cache-function.png에 대한 설명
캐시 함수를 정의할 때 함수 이름은 소유자 스키마로 정규화되어야 합니다.
-
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;
-
shelflife매개변수가 3600(초)으로 설정된PIPE_TEST라는 명시적 싱글톤 파이프를 생성합니다.DECLARE l_status INTEGER; BEGIN l_status := DBMS_PIPE.CREATE_PIPE( pipename => 'MY_PIPE1', private => TRUE, singleton => TRUE, shelflife => 3600); END; /자세한 내용은 CREATE_PIPE 함수를 참조하십시오.
-
싱글톤 파이프가 작성되었는지 확인합니다.
SELECT name, singleton, type FROM v$db_pipes WHERE name= '&pipename' ORDER BY 1;NAME SINGLETON TYPE -------------------- ---------- ------- PIPE_TEST YES PRIVATE -
싱글톤 파이프에서 메시지를 포장하고 전송합니다.
EXEC DBMS_PIPE.PACK_MESSAGE('This is a real message that you can get multiple times'); SELECT DBMS_PIPE.SEND_MESSAGE(pipename => '&pipename') status FROM DUAL;STATUS ---------- 0자세한 내용은 Oracle Database 19c PL/SQL Packages and Types Reference의 PACK_MESSAGE Procedures 또는 Oracle Database 26ai PL/SQL Packages and Types Reference 및 SEND_MESSAGE Function을 참조하십시오.
-
싱글톤 파이프에서 메시지를 수신합니다.
SELECT * FROM receive_message( pipename => '&pipename', rcv_count => 2);MESSAGE -------------------------------------------------------------------------------- This is a real message that you can get multiple times This is a real message that you can get multiple timesreceive_message함수는DBMS_PIPE.RECEIVE_MESSAGE를 호출하는 helper 함수입니다. -
메시지를 비우고 파이프를 제거합니다.
EXEC DBMS_PIPE.PURGE('&pipename'); SELECT DBMS_PIPE.REMOVE_PIPE('&pipename') status FROM DUAL;
캐시 함수를 사용하여 명시적 싱글톤 파이프 생성
지정된 파이프 이름, 명시적 싱글톤 파이프를 사용하여 싱글톤 파이프를 작성하고 캐시 함수를 제공하는 단계에 대해 설명합니다. 캐시 함수를 사용하면 싱글톤 파이프에서 메시지를 자동으로 채울 수 있습니다.
-
싱글톤 파이프에 대한 캐시 함수
test_cache_message를 생성합니다.CREATE OR REPLACE FUNCTION test_cache_message( pipename IN VARCHAR2) return NUMBER AS l_status NUMBER; l_data VARCHAR2(4000); BEGIN l_status := DBMS_PIPE.CREATE_PIPE( pipename => pipename, private => TRUE, singleton => true, shelflife => 600); IF l_status != 0 THEN RETURN l_status; END IF; DBMS_PIPE.PACK_MESSAGE('This is a placeholder cache message for an empty pipe'); l_status := DBMS_PIPE.SEND_MESSAGE(pipename => pipename); RETURN l_status; END; /주: 캐시 함수를 실행하려면
DBMS_PIPE.RECEIVE_MESSAGE를 호출하는 현재 세션 사용자에게 필요한 권한이 있어야 합니다. -
캐시 함수를 받아 파이프에서 메시지 채우기를 확인합니다. 파이프는 캐시 함수에 생성된 전용 파이프로 존재해야 합니다.
SELECT * FROM receive_message( pipename => '&pipename', rcv_count => 1, cache_func => 'TEST_CACHE_MESSAGE');MESSAGE --------------- This is a placeholder cache message for an empty pipereceive_message함수는DBMS_PIPE.RECEIVE_MESSAGE를 호출하는 helper 함수입니다.receive_message정의는 Create an Explicit Singleton Pipe를 참조하십시오.자세한 내용은 CREATE_PIPE 함수를 참조하십시오.
-
캐시 함수 없이 수신하여 파이프에서 메시지가 지속되는지 확인합니다.
SELECT * FROM receive_message( pipename => '&pipename', rcv_count => 2);MESSAGE --------------- This is a placeholder cache message for an empty pipe This is a placeholder cache message for an empty pipereceive_message함수는DBMS_PIPE.RECEIVE_MESSAGE를 호출하는 helper 함수입니다.receive_message정의는 Create an Explicit Singleton Pipe를 참조하십시오.자세한 내용은 CREATE_PIPE 함수를 참조하십시오.