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

싱글톤 파이프는 사용자 정의 메시지를 캐시에 저장 및 검색하고 여러 데이터베이스 세션에서 동시 읽기를 사용하여 메시지를 공유할 수 있는 DBMS_PIPE 패키지에 추가됩니다.

싱글톤 파이프를 사용하여 메시지 캐싱 정보

DBMS_PIPE 패키지는 싱글톤 파이프를 지원하기 위해 자율운영 AI 데이터베이스에서 확장된 기능을 제공합니다.

DBMS_PIPE의 싱글톤 파이프:

표준 파이프 및 싱글톤 파이프 정보

DBMS_PIPE 패키지를 사용하면 두 개 이상의 데이터베이스 세션이 in-memory 메시지를 사용하여 통신할 수 있습니다. 파이프 기능에는 외부 서비스 인터페이스, 디버깅, 독립 트랜잭션 및 경보와 같은 여러 응용 프로그램이 있습니다. 자세한 내용은 Oracle Database 19c PL/SQL Packages and Types ReferenceDBMS_PIPE 또는 Oracle Database 26ai PL/SQL Packages and Types Reference를 참조하십시오.

database-pipe-messages-singleton-pipes.png 그림에 대한 설명

싱글톤 파이프는 지원되는 DBMS_PIPE 유형 중 하나일 수 있습니다.

싱글톤 파이프는 자율운영 AI 데이터베이스 인스턴스의 메모리에 단일 메시지를 캐시에 저장할 수 있는 기능을 제공합니다.

다음은 싱글톤 파이프를 사용하기 위한 일반적인 워크플로우를 보여줍니다.

그림 singleton-pipe-workflow.png에 대한 설명

싱글톤 파이프 개요 및 기능

싱글톤 파이프 공정

연산 DBMS_PIPE 함수 또는 절차
명시적 싱글톤 파이프 만들기 CREATE_PIPE 함수
싱글톤 파이프에서 메시지 캐시

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

SEND_MESSAGE 함수

싱글톤 파이프에서 캐시된 메시지 읽기 Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 26ai PL/SQL Packages and Types ReferenceRECEIVE_MESSAGE Function, UNPACK_MESSAGE Procedures
싱글톤 파이프에서 메시지 삭제 Oracle Database 19c PL/SQL Packages and Types Reference 또는 Oracle Database 26ai PL/SQL Packages and Types ReferencePURGE 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를 호출하여 메시지를 명시적으로 캐시해야 합니다. 싱글톤 파이프에서 읽을 때 메시지를 사용할 수 없는 경우를 방지하기 위해 캐시 함수를 정의할 수 있습니다. 캐시 함수가 정의된 경우 다음 시나리오에서 메시지를 수신하면 캐시 함수가 자동으로 호출됩니다.

캐시 함수를 사용하려면 캐시 함수를 정의하고 DBMS_PIPE.RECEIVE_MESSAGEcache_func 매개변수를 포함시킵니다. 유저 정의 캐시 함수는 다음을 제공합니다.

캐시 함수를 사용하면 싱글톤 파이프 작업을 간소화할 수 있습니다. 빈 파이프에서 메시지를 수신하기 위해 실패 사례를 처리할 필요는 없습니다. 또한 캐시 함수를 사용하면 싱글톤 파이프에서 메시지를 읽을 때 캐시된 메시지를 최대로 사용할 수 있으므로 캐시 실패가 발생하지 않습니다.

아래 automatic-cache-refresh-cache-function.eps에 대한 설명입니다.

그림 automatic-cache-refresh-cache-function.png에 대한 설명

캐시 함수를 정의할 때 함수 이름은 소유자 스키마로 정규화되어야 합니다.

다음 서명을 사용하여 캐시 함수를 정의합니다.

CREATE OR REPLACE FUNCTION *cache_function_name*(
       pipename  IN VARCHAR2
) RETURN INTEGER;

캐시 함수 내의 일반적인 작업은 다음과 같습니다.

캐시 함수를 사용하려면 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 함수를 참조하십시오.

  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
    

    자세한 내용은 Oracle Database 19c PL/SQL Packages and Types ReferencePACK_MESSAGE Procedures 또는 Oracle Database 26ai PL/SQL Packages and Types ReferenceSEND_MESSAGE Function을 참조하십시오.

  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를 호출하는 helper 함수입니다.

  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를 호출하는 helper 함수입니다. receive_message 정의는 Create an Explicit Singleton Pipe를 참조하십시오.

    자세한 내용은 CREATE_PIPE 함수를 참조하십시오.

  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를 호출하는 helper 함수입니다. receive_message 정의는 Create an Explicit Singleton Pipe를 참조하십시오.

    자세한 내용은 CREATE_PIPE 함수를 참조하십시오.

관련 콘텐츠