Persistentes Messaging mit Nachrichten verwenden, die im Cloud-Objektspeicher gespeichert sind

Das Package DBMS_PIPE verfügt über erweiterte Funktionen in Autonomous Database zur Unterstützung von persistentem Messaging, bei dem Nachrichten im Cloud-Objektspeicher gespeichert werden.

Informationen zum persistenten Messaging mit DBMS_PIPE

Durch persistentes Messaging mit DBMS_PIPE können eine oder mehrere Datenbanksessions in derselben Region oder regionsübergreifend mit Nachrichten kommunizieren, die im Cloud-Objektspeicher gespeichert sind.

Persistente Nachrichten in DBMS_PIPE:

  • Sie können sehr große Nachrichten senden und abrufen.

  • Unterstützung für das Senden einer großen Anzahl von Pipe-Nachrichten.

  • Unterstützt das Senden und Empfangen von Nachrichten innerhalb einer einzelnen Datenbank, über mehrere Datenbanken und über Datenbanken in verschiedenen Regionen hinweg.

  • Unterstützen Sie mehrere Pipes mit derselben Cloud-Objektspeicher-URI.

Persistente Messaging Pipes können in einem der unterstützten DBMS_PIPE-Typen erstellt werden:

  • Implizite Pipe: Wird automatisch erstellt, wenn eine Nachricht mit einem unbekannten Pipe-Namen mit der Funktion DBMS_PIPE.SEND_MESSAGE gesendet wird.
  • Explizite Pipe: Wird mit der Funktion DBMS_PIPE.CREATE_PIPE mit einem vom Benutzer angegebenen Pipe-Namen erstellt.
  • Öffentliche Pipe: Jeder Benutzer mit der Berechtigung EXECUTE für das Package DBMS_PIPE kann darauf zugreifen.
  • Private Pipe: Zugriff durch Sessions mit demselben Benutzer wie der Pipe-Ersteller möglich.
Hinweis

Oracle empfiehlt, eine explizite Pipe zu erstellen, bevor Sie Nachrichten mit persistentem Messaging senden oder empfangen. Durch das Erstellen einer expliziten Pipe mit DBMS_PIPE.CREATE_PIPE wird sichergestellt, dass die Pipe mit den gewünschten Zugriffsberechtigungen erstellt wird, entweder öffentlich oder privat (durch Festlegen des Parameters private).

Im Folgenden wird der allgemeine Workflow für DBMS_PIPE mit persistentem Messaging dargestellt:

Beschreibung von database-pipe-persistent-messaging.eps folgt
Beschreibung der Abbildung database-pipe-persistent-messaging.eps

Vorhandene Anwendungen, die DBMS_PIPE verwenden, können weiterhin mit minimalen Änderungen ausgeführt werden. Sie können vorhandene Anwendungen konfigurieren, die DBMS_PIPE mit einem Zugangsdatenobjekt und einer Speicherort-URI verwenden, indem Sie einen Anmeldetrigger verwenden oder eine andere Initialisierungsroutine verwenden. Nachdem Sie die Zugangsdaten und die Speicherort-URI DBMS_PIPE festgelegt haben, sind keine weiteren Änderungen erforderlich, um persistentes Messaging zu verwenden. Bei der nachfolgenden Verwendung der Pipe werden die Nachrichten im Cloud-Objektspeicher anstatt im Datenbankspeicher gespeichert. Auf diese Weise können Sie die Speichermethode für Nachrichten mit minimalen Änderungen von In-Memory in persistenten Cloud-Objektspeicher ändern.

Persistent Messaging - Überblick und Features

Features von DBMS_PIPE mit persistentem Messaging:

  • Nachrichten können über mehrere Autonomous Database-Instanzen in derselben Region oder über Regionen hinweg gesendet und abgerufen werden.

  • Persistente Nachrichten werden garantiert entweder von genau einem Prozess geschrieben oder gelesen. Dadurch wird eine Inkonsistenz des Nachrichteninhalts durch gleichzeitige Schreib- und Lesevorgänge verhindert. Mit einer persistenten Messaging-Pipe lässt DBMS_PIPE nur einen Vorgang zu, bei dem eine Nachricht oder eine empfangende Nachricht zu einem bestimmten Zeitpunkt aktiv sein kann. Wenn ein Vorgang jedoch aufgrund eines laufenden Vorgangs nicht möglich ist, wiederholt sich der Prozess in regelmäßigen Abständen, bis der Wert timeout erreicht ist.

  • DBMS_PIPE verwendet DBMS_CLOUD, um auf den Cloud-Objektspeicher zuzugreifen. Nachrichten können in einem der unterstützten Cloud-Objektspeicher gespeichert werden. Weitere Informationen finden Sie unter DBMS_CLOUD URI-Formate.

  • DBMS_PIPE verwendet DBMS_CLOUD für den Zugriff auf den Cloud-Objektspeicher, und alle unterstützten Zugangsdatentypen sind verfügbar:

DBMS_PIPE Berechtigungen Autorisierung und Sicherheit

Die DBMS_PIPE-Prozeduren werden mit den Rechten des ausführenden Benutzers ausgeführt. Private Pipes sind Eigentum des aktuellen Benutzers. Eine private Pipe, die von einem Benutzer erstellt wird, kann nur von demselben Benutzer verwendet werden. Dies gilt sowohl für speicherresidente Pipes als auch für persistente Messaging Pipes, in denen Nachrichten im Cloud-Objektspeicher gespeichert werden. Das Senden und Empfangen von Nachrichten wird im Schema des ausführenden Benutzers ausgeführt.

Mit privaten Pipes, in denen Nachrichten im Cloud-Objektspeicher gespeichert werden, ist ein Zugangsdatenobjekt für die Authentifizierung mit dem Cloud-Objektspeicher erforderlich, der mit dem Parameter location_uri identifiziert wird. Der aufrufende Benutzer muss über die Berechtigung EXECUTE für das Zugangsdatenobjekt verfügen, das mit dem Parameter credential_name angegeben wird, mit dem auf den Objektspeicher zugegriffen wird.

Um eine öffentliche Pipe verwenden zu können, muss der Benutzer, die Datenbanksession, über die Ausführungsberechtigung für DBMS_PIPE verfügen. Bei einer öffentlichen Pipe, die persistentes Messaging verwendet und Nachrichten im Cloud-Objektspeicher speichert, muss der Benutzer, die Datenbanksession, über die Ausführungsberechtigung für DBMS_CLOUD und die Ausführungsberechtigung für das Zugangsdatenobjekt verfügen (oder Sie können ein Zugangsdatenobjekt erstellen, das auf die Speicherort-URI zugreifen kann, in der die Nachricht enthalten ist).

DBMS_PIPE Einschränkung

Das Package DBMS_PIPE unterstützt nicht das Senden von Nachrichten zwischen Datenbanken, die unterschiedliche Zeichensätze verwenden. Beispiel: Wenn Sie eine Autonomous Database-Instanz verwenden, die AL32UTF8 verwendet, und eine andere Instanz, die WE8MSWIN1252 verwendet, können Sie keine Nachrichten mit DBMS_PIPE zwischen diesen beiden Datenbanken senden. In diesem Fall löst das System den Fehler ORA-12704 aus, wenn Sie versuchen, Nachrichten mit DBMS_PIPE zwischen diesen beiden Datenbanken zu senden.

Weitere Informationen finden Sie unter Zeichensatz für Autonomous Database auswählen.

Explizite persistente Pipe erstellen und Nachricht senden

Beschreibt die Schritte zum Erstellen einer persistenten Pipe mit einem angegebenen Pipe-Namen (Explicit Pipe).

  1. Speichern Sie Ihre Objektspeicherzugangsdaten mit der Prozedur DBMS_CLOUD.CREATE_CREDENTIAL. Beispiele:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'my_persistent_pipe_cred',
        username => 'adb_user@example.com',
        password => 'password'
      );
    END;
    /

    Dieser Vorgang speichert die Zugangsdaten in einem verschlüsselten Format in der Datenbank. Sie können einen beliebigen Namen als Zugangsdatenname verwenden. Beachten Sie, dass dieser Schritt nur einmal erforderlich ist, es sei denn, Ihre Objektspeicherzugangsdaten werden geändert. Nachdem Sie die Zugangsdaten gespeichert haben, können Sie mit demselben Zugangsdatennamen auf den Cloud-Objektspeicher zugreifen, um Nachrichten mit DBMS_PIPE zu senden und zu empfangen.

    Weitere Informationen zu den Parametern finden Sie unter Prozedur CREATE_CREDENTIAL. Für Oracle Cloud Infrastructure Object Storage müssen die Zugangsdaten eine native Oracle Cloud Infrastructure-Authentifizierung verwenden.

    Das Erstellen von Zugangsdaten für den Zugriff auf Oracle Cloud Infrastructure Object Storage ist nicht erforderlich, wenn Sie Ressourcen-Principal-Zugangsdaten aktivieren. Weitere Informationen finden Sie unter Resource Principal für den Zugriff auf Oracle Cloud Infrastructure-Ressourcen verwenden.

    Hinweis

    Einige Tools wie SQL*Plus und SQL Developer verwenden das Et-Zeichen (&) als Sonderzeichen. Wenn das Et-Zeichen in Ihrem Kennwort enthalten ist, verwenden Sie den Befehl SET DEFINE OFF in diesen Tools, wie im Beispiel gezeigt, um das Sonderzeichen zu deaktivieren und die Zugangsdaten korrekt zu erstellen.
  2. Erstellen Sie eine explizite Pipe, um Nachrichten zu senden und abzurufen. Beispiel: Erstellen Sie eine Pipe mit dem Namen ORDER_PIPE.
    DECLARE
      r_status INTEGER;
    BEGIN
        r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
    END;
    /

    Weitere Informationen finden Sie unter Funktion CREATE_PIPE.

  3. Prüfen Sie, ob die Pipe erstellt wurde.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 
  4. Verwenden Sie DBMS_PIPE-Prozeduren, um die Standardzugriffszugangsdaten und die Speicherort-URI festzulegen, um persistente Nachrichten im Cloud-Objektspeicher zu speichern.
    BEGIN
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
    END;
    /

    Diese Prozeduren legen den Standardzugangsdaten-Namen und die Standardspeicherort-URI für die Verwendung mit DBMS_PIPE-Prozeduren fest.

    Wenn Sie Nachrichten mit Oracle Cloud Infrastructure Object Storage speichern, können Sie native URIs oder Swift-URIs von Oracle Cloud Infrastructure verwenden. Der Speicherort-URI und die Zugangsdaten müssen jedoch wie folgt mit dem Typ übereinstimmen:

    • Wenn Sie für den Zugriff auf Oracle Cloud Infrastructure Object Storage ein natives URI-Format verwenden, müssen Sie die native Oracle Cloud Infrastructure-Signaturschlüsselauthentifizierung im Zugangsdatenobjekt verwenden.

    • Wenn Sie mit dem Swift-URI-Format auf Oracle Cloud Infrastructure Object Storage zugreifen, müssen Sie eine Authentifizierung des Authentifizierungstokens im Zugangsdatenobjekt verwenden.

    Weitere Informationen finden Sie unter Prozedur SET_CREDENTIAL_NAME und Prozedur SET_LOCATION_URI.

  5. Packen und senden Sie eine Nachricht auf der Pipe.
    DECLARE
      l_result INTEGER;
      l_date   DATE;
    BEGIN
        l_date := sysdate;
        DBMS_PIPE.PACK_MESSAGE(l_date);         -- date of order
        DBMS_PIPE.PACK_MESSAGE('C123');         -- order number
        DBMS_PIPE.PACK_MESSAGE(5);              -- number of items in order
        DBMS_PIPE.PACK_MESSAGE('Printers');     -- type of item in order
    
     
        l_result := DBMS_PIPE.SEND_MESSAGE(
                        pipename => 'ORDER_PIPE',
                        credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                        location_uri => DBMS_PIPE.GET_LOCATION_URI);
         
        IF l_result = 0 THEN
            DBMS_OUTPUT.put_line('DBMS_PIPE sent order successfully');
        END IF;
     
    END;
    /

    Weitere Informationen finden Sie unter PACK_MESSAGE-Prozeduren und SEND_MESSAGE-Funktion.

Persistente Nachricht in derselben Datenbank abrufen

Beschreibt die Schritte zum Abrufen einer persistenten Nachricht aus einer expliziten Pipe in derselben Autonomous Database-Instanz (der Instanz, in der die Nachricht gesendet wurde).

In einer Autonomous Database-Instanz können Sie Nachrichten empfangen, die von einer anderen Session an eine Pipe gesendet wurden. Die DBMS_PIPE-Prozeduren sind Prozeduren für die Rechte des ausführenden Benutzers und werden als der aktuell aufgerufene Benutzer ausgeführt.

Private Pipes sind Eigentum des aktuellen Benutzers, der die Pipe erstellt. Private Pipes können nur von demselben Benutzer aufgerufen werden, der die Pipe erstellt hat. Dies gilt für Pipes, die In-Memory-Nachrichten verwenden, und für Pipes, die persistentes Messaging mit Nachrichten verwenden, die im Cloud-Objektspeicher gespeichert sind.

Öffentliche Pipes können von jeder Datenbanksession mit Ausführungsberechtigung für DBMS_PIPE aufgerufen werden. Dies gilt für Pipes, die In-Memory-Nachrichten verwenden, und für Pipes, die persistentes Messaging mit Nachrichten verwenden, die im Cloud-Objektspeicher gespeichert sind.

  1. Prüfen Sie, ob die Pipe erstellt wurde.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 

    Wenn Sie sich in derselben Autonomous Database-Instanz befinden und die Pipe vorhanden ist, müssen Sie DBMS_PIPE.CREATE_PIPE nicht ausführen, bevor Sie eine Nachricht erhalten. Dies gilt, wenn die Pipe auf derselben Instanz erstellt wurde (siehe Explizite persistente Pipe erstellen und Nachricht senden).

  2. Erhalten Sie eine Nachricht von der Pipe.
    DECLARE
        message1  DATE;
        message2  VARCHAR2(100);
        message3  INTEGER;
        message4  VARCHAR2(100);
        l_result  INTEGER;
    
    BEGIN
    
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
        l_result := DBMS_PIPE.RECEIVE_MESSAGE (
                      pipename => 'ORDER_PIPE',
                      timeout  => DBMS_PIPE.MAXWAIT,
                      credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                      location_uri => DBMS_PIPE.GET_LOCATION_URI);
     
        IF l_result = 0 THEN
            DBMS_PIPE.unpack_message(message1);
            DBMS_PIPE.unpack_message(message2);
            DBMS_PIPE.unpack_message(message3);
            DBMS_PIPE.unpack_message(message4);
     
            DBMS_OUTPUT.put_line('Order Received Successfully On: ' || TO_CHAR(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
            DBMS_OUTPUT.put_line('Date of Order: ' || message1);
            DBMS_OUTPUT.put_line('Order Number: ' || message2);
            DBMS_OUTPUT.put_line('Number of Items In Order: ' || message3);
            DBMS_OUTPUT.put_line('Item Type in Order: ' || message4);
        END IF;
     
    END;
    /

    Wenn Sie sich in derselben Autonomous Database-Instanz befinden, sind die Zugangsdaten bereits vorhanden, und Sie müssen DBMS_CLOUD.CREATE_CREDENTIAL nicht ausführen, um eine Nachricht zu erhalten. Dies gilt, wenn die Pipe auf derselben Instanz erstellt wurde (siehe Explizite persistente Pipe erstellen und Nachricht senden).

Weitere Informationen finden Sie unter Prozedur SET_CREDENTIAL_NAME und Prozedur SET_LOCATION_URI.

Weitere Informationen finden Sie unter Funktion RECEIVE_MESSAGE.

Persistente Nachrichten durch Erstellen einer Pipe in einer anderen Datenbank abrufen

Beschreibt die Schritte zum Abrufen einer persistenten Nachricht, die im Cloud-Objektspeicher mit einer expliziten Pipe in einer Autonomous Database-Instanz gespeichert ist und sich von der Instanz unterscheidet, die die Nachricht gesendet hat.

  1. Speichern Sie Ihre Objektspeicherzugangsdaten mit der Prozedur DBMS_CLOUD.CREATE_CREDENTIAL. Beispiele:
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'my_persistent_pipe_cred',
        username => 'adb_user@example.com',
        password => 'password'
      );
    END;
    /

    Dieser Vorgang speichert die Zugangsdaten in einem verschlüsselten Format in der Datenbank. Sie können einen beliebigen Namen als Zugangsdatenname verwenden. Beachten Sie, dass dieser Schritt nur einmal erforderlich ist, es sei denn, Ihre Objektspeicherzugangsdaten werden geändert. Nachdem Sie die Zugangsdaten gespeichert haben, können Sie mit demselben Zugangsdatennamen auf den Cloud-Objektspeicher zugreifen, um Nachrichten mit DBMS_PIPE zu senden und zu empfangen.

    Weitere Informationen zu den Parametern finden Sie unter Prozedur CREATE_CREDENTIAL.

    Das Erstellen von Zugangsdaten für den Zugriff auf Oracle Cloud Infrastructure Object Storage ist nicht erforderlich, wenn Sie Ressourcen-Principal-Zugangsdaten aktivieren. Weitere Informationen finden Sie unter Resource Principal für den Zugriff auf Oracle Cloud Infrastructure-Ressourcen verwenden.

    Hinweis

    Einige Tools wie SQL*Plus und SQL Developer verwenden das Et-Zeichen (&) als Sonderzeichen. Wenn das Et-Zeichen in Ihrem Kennwort enthalten ist, verwenden Sie den Befehl SET DEFINE OFF in diesen Tools, wie im Beispiel gezeigt, um das Sonderzeichen zu deaktivieren und die Zugangsdaten korrekt zu erstellen.
  2. Erstellen Sie eine explizite Pipe mit demselben Namen wie die Pipe, von der die Nachricht gesendet wurde. Beispiel: Erstellen Sie eine Pipe mit dem Namen ORDER_PIPE.
    DECLARE
      r_status INTEGER;
    BEGIN
        r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
    END;
    /
  3. Prüfen Sie, ob die Pipe erstellt wurde.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 
  4. Verwenden Sie DBMS_PIPE-Prozeduren, um die Standardzugriffszugangsdaten und die Speicherort-URI für den Objektspeicher festzulegen, sodass DBMS_PIPE auf die persistente Nachricht zugreifen kann.
    BEGIN
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
    END;
    /

    Diese Prozeduren legen den Standardzugangsdaten-Namen und die Standardspeicherort-URI für die Verwendung mit DBMS_PIPE-Prozeduren fest.

    Wenn Sie Nachrichten mit Oracle Cloud Infrastructure Object Storage speichern, können Sie native URIs oder Swift-URIs von Oracle Cloud Infrastructure verwenden. Der Speicherort-URI und die Zugangsdaten müssen jedoch wie folgt mit dem Typ übereinstimmen:

    • Wenn Sie für den Zugriff auf Oracle Cloud Infrastructure Object Storage ein natives URI-Format verwenden, müssen Sie die native Oracle Cloud Infrastructure-Signaturschlüsselauthentifizierung im Zugangsdatenobjekt verwenden.

    • Wenn Sie mit dem Swift-URI-Format auf Oracle Cloud Infrastructure Object Storage zugreifen, müssen Sie eine Authentifizierung des Authentifizierungstokens im Zugangsdatenobjekt verwenden.

    Weitere Informationen finden Sie unter Prozedur SET_CREDENTIAL_NAME und Prozedur SET_LOCATION_URI.

  5. Erhalten Sie eine Nachricht von der persistenten Pipe.
    DECLARE
        message1  DATE;
        message2  VARCHAR2(100);
        message3  INTEGER;
        message4  VARCHAR2(100);
        l_result  INTEGER;
    
    BEGIN
    
        DBMS_PIPE.SET_CREDENTIAL_NAME('my_persistent_pipe_cred');
        DBMS_PIPE.SET_LOCATION_URI('https://objectstorage.us-phoenix-1.oraclecloud.com/n/namespace-string/b/bucketname1/'); 
        l_result := DBMS_PIPE.RECEIVE_MESSAGE (
                      pipename => 'ORDER_PIPE',
                      timeout  => DBMS_PIPE.MAXWAIT,
                      credential_name => DBMS_PIPE.GET_CREDENTIAL_NAME,
                      location_uri => DBMS_PIPE.GET_LOCATION_URI);
     
        IF l_result = 0 THEN
            DBMS_PIPE.unpack_message(message1);
            DBMS_PIPE.unpack_message(message2);
            DBMS_PIPE.unpack_message(message3);
            DBMS_PIPE.unpack_message(message4);
     
            DBMS_OUTPUT.put_line('Order Received Successfully On: ' || TO_CHAR(sysdate, 'dd-mm-yyyy hh24:mi:ss'));
            DBMS_OUTPUT.put_line('Date of Order: ' || message1);
            DBMS_OUTPUT.put_line('Order Number: ' || message2);
            DBMS_OUTPUT.put_line('Number of Items In Order: ' || message3);
            DBMS_OUTPUT.put_line('Item Type in Order: ' || message4);
        END IF;
     
    END;
    /

    Weitere Informationen finden Sie unter Funktion RECEIVE_MESSAGE.

Persistente Pipe entfernen

Beschreibt die Schritte zum Entfernen einer persistenten Pipe.

Persistente Pipes senden und empfangen Nachrichten, indem sie Nachrichten im Cloud-Objektspeicher speichern. Verwenden Sie DBMS_PIPE.REMOVE_PIPE, um eine persistente Pipe in einer Autonomous Database-Instanz zu entfernen.

  1. Rufen Sie die Funktion DBMS_PIPE.REMOVE_PIPE auf, um eine Pipe zu entfernen.
    DECLARE
       l_result  INTEGER;
    BEGIN
         l_result := DBMS_PIPE.REMOVE_PIPE('ORDER_PIPE');
    END;
    /

    Die Funktion REMOVE_PIPE entfernt die Pipe aus der Autonomous Database-Instanz, in der sie ausgeführt wird. REMOVE_PIPE wirkt sich jedoch nicht auf andere Autonomous Database-Instanzen mit einer Pipe mit demselben Namen aus, die denselben Speicherort-URI verwendet.

  2. Wenn Sie in der Autonomous Database-Instanz DBMS_PIPE.REMOVE_PIPE ausgeführt haben, prüfen Sie, ob die Pipe entfernt wurde.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    No rows selected