싱글톤 파이프로 메시지 캐시

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에 대한 설명입니다.
그림 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에 대한 설명입니다.
그림 singleton-pipe-workflow.eps에 대한 설명

싱글톤 파이프 개요 및 피쳐

  • 싱글톤 메시지

    • 싱글톤 파이프는 파이프에서 하나의 메시지를 캐시에 저장할 수 있으므로 이름 "싱글톤"입니다.
    • 싱글톤 파이프의 메시지는 최대 32,767바이트의 총 메시지 크기까지 여러 필드로 구성될 수 있습니다.
    • DBMS_PIPEDBMS_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 함수 또는 프로시저

명시적 싱글톤 파이프 작성

CREATE_PIPE 함수

싱글톤 파이프에서 메시지 캐시

Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 23ai PL/SQL Packages and Types ReferencePACK_MESSAGE Procedures

SEND_MESSAGE 함수

싱글톤 파이프에서 캐시된 메시지 읽기

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 ReferenceREMOVE_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에 대한 설명입니다.
그림 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;
  1. 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 Function을 참조하십시오.

  2. 싱글톤 파이프가 작성되었는지 확인합니다.
    SELECT name, singleton, type
         FROM v$db_pipes WHERE name= '&pipename' ORDER BY 1;
    
    NAME                 SINGLETON  TYPE
    -------------------- ---------- -------
    PIPE_TEST            YES        PRIVATE
  3. 싱글톤 파이프에 메시지를 포장하고 보냅니다.
    
    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
  4. 싱글톤 파이프에서 메시지를 받습니다.
    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 times

    receive_message 함수는 DBMS_PIPE.RECEIVE_MESSAGE를 호출하는 도우미 함수입니다.

  5. 메시지를 비우고 파이프를 제거합니다.
    EXEC DBMS_PIPE.PURGE('&pipename');
    SELECT DBMS_PIPE.REMOVE_PIPE('&pipename') status FROM DUAL;

캐시 함수를 사용하여 명시적 싱글톤 파이프 작성

지정된 파이프 이름, 명시적 싱글톤 파이프를 사용하여 싱글톤 파이프를 작성하고 캐시 함수를 제공하는 단계에 대해 설명합니다. 캐시 함수를 사용하면 싱글톤 파이프에서 메시지를 자동으로 채울 수 있습니다.

  1. 싱글톤 파이프에 대한 캐시 함수 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를 호출하는 현재 세션 사용자에게 필요한 권한이 있어야 합니다.
  2. 캐시 함수로 수신하고 파이프에서 메시지가 채워지는지 확인합니다. 파이프는 캐시 함수에서 생성된 전용 파이프로 존재해야 합니다.
    SELECT * FROM receive_message(
         pipename => '&pipename',
         rcv_count => 1,
         cache_func => 'TEST_CACHE_MESSAGE');
    
    MESSAGE
    ---------------
    This is a placeholder cache message for an empty pipe
    

    receive_message 함수는 DBMS_PIPE.RECEIVE_MESSAGE를 호출하는 도우미 함수입니다. receive_message 정의는 명시적 싱글톤 파이프 생성을 참조하십시오.

    자세한 내용은 CREATE_PIPE Function을 참조하십시오.

  3. 캐시 함수 없이 수신하여 메시지가 파이프에 지속되는지 확인합니다.
    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 pipe

    receive_message 함수는 DBMS_PIPE.RECEIVE_MESSAGE를 호출하는 도우미 함수입니다. receive_message 정의는 명시적 싱글톤 파이프 생성을 참조하십시오.

    자세한 내용은 CREATE_PIPE Function을 참조하십시오.