Utiliser la messagerie persistante avec les messages stockés dans un magasin d'objets en nuage

L'ensemble DBMS_PIPE offre des fonctionnalités étendues sur Autonomous AI Database afin de prendre en charge les messages persistants, où les messages sont stockés dans le magasin d'objets en nuage.

À propos de la messagerie persistante avec DBMS_PIPE

La messagerie persistante avec DBMS_PIPE permet à une ou plusieurs sessions de base de données de communiquer dans la même région ou entre régions avec des messages stockés dans le magasin d'objets en nuage.

Messages persistants dans DBMS_PIPE :

  • Permet d'envoyer et de récupérer des messages très volumineux.

  • Prise en charge de l'envoi d'un grand nombre de messages de canal.

  • Prise en charge de l'envoi et de la réception de messages dans une seule base de données, dans plusieurs bases de données et entre des bases de données de différentes régions.

  • Prendre en charge plusieurs canaux à l'aide du même URI d'emplacement du magasin d'objets en nuage.

Les canaux de messagerie persistants peuvent être créés dans n'importe lequel des types DBMS_PIPE pris en charge :

  • Canal implicite : Créé automatiquement lorsqu'un message est envoyé avec un nom de canal inconnu à l'aide de la fonction DBMS_PIPE.SEND_MESSAGE.
  • Canal explicite : Créé à l'aide de la fonction DBMS_PIPE.CREATE_PIPE avec un nom de canal spécifié par l'utilisateur.
  • Public Pipe : Accessible par tout utilisateur disposant de l'autorisation EXECUTE sur l'ensemble DBMS_PIPE.
  • Canal privé : Accessible par des sessions avec le même utilisateur que le créateur du canal.
Note

Oracle recommande de créer un canal explicite avant d'envoyer ou de recevoir des messages avec une messagerie persistante. La création d'un canal explicite avec DBMS_PIPE.CREATE_PIPE garantit que le canal est créé avec les autorisations d'accès voulues, publiques ou privées (en définissant le paramètre private).

Voici le flux de travail général pour DBMS_PIPE avec messagerie persistante :

Description de database-pipe-persistent-messaging.eps :
Description de l'illustration database-pipe-persistent-messaging.eps

Les applications existantes utilisant DBMS_PIPE peuvent continuer à fonctionner avec un minimum de modifications. Vous pouvez configurer des applications existantes qui utilisent DBMS_PIPE avec un objet de données d'identification et un URI d'emplacement à l'aide d'un déclencheur de connexion ou d'un autre sous-programme d'initialisation. Après avoir défini les données d'identification et l'URI d'emplacement DBMS_PIPE, aucune autre modification n'est nécessaire pour utiliser la messagerie persistante. Toute utilisation ultérieure du canal stocke les messages dans le magasin d'objets en nuage plutôt que dans la mémoire de la base de données. Cela vous permet de remplacer la méthode de stockage des messages en mémoire par celle du stockage d'objets en nuage persistant, avec un minimum de modifications.

Présentation et fonctionnalités de la messagerie persistante

Caractéristiques de DBMS_PIPE à l'aide de la messagerie persistante :

  • Les messages peuvent être envoyés et extraits sur plusieurs instances de base de données autonome avec intelligence artificielle dans la même région ou entre des régions.

  • Les messages persistants sont garantis d'être écrits ou lus par un seul processus. Cela évite les incohérences dans le contenu des messages en raison d'écritures et de lectures simultanées. À l'aide d'un canal de messagerie persistant, DBMS_PIPE autorise une seule opération, l'envoi d'un message ou d'un message de réception à être actif à un moment donné. Toutefois, si une opération n'est pas possible en raison d'une opération en cours, le processus tente de nouveau périodiquement jusqu'à ce que la valeur timeout soit atteinte.

  • DBMS_PIPE utilise DBMS_CLOUD pour accéder au magasin d'objets en nuage. Les messages peuvent être stockés dans n'importe quel magasin d'objets en nuage pris en charge. Pour plus d'informations, voir Formats d'URI DBMS_CLOUD.

  • DBMS_PIPE utilise DBMS_CLOUD pour accéder au magasin d'objets en nuage et tous les types de données d'identification pris en charge sont disponibles :

DBMS_PIPE Privilèges - Autorisation et sécurité

Les procédures DBMS_PIPE s'exécutent avec les droits de l'appelant. Les canalisations privées appartiennent à l'utilisateur courant et une canalisation privée créée par un utilisateur ne peut être utilisée que par le même utilisateur. Cela s'applique à la fois aux canaux en mémoire et aux canaux de messagerie persistants où les messages sont stockés dans le magasin d'objets en nuage. L'envoi et la réception de messages sont exécutés dans le schéma de l'appelant.

À l'aide de canaux privés, où les messages sont stockés dans le magasin d'objets en nuage, un objet de données d'identification est requis pour l'authentification avec le magasin d'objets en nuage identifié par le paramètre location_uri. L'utilisateur appelant doit disposer du privilège EXECUTE sur l'objet de données d'identification spécifié avec le paramètre credential_name utilisé pour accéder au magasin d'objets.

Pour utiliser un canal public, l'utilisateur, la session de base de données, doit disposer du privilège d'exécution sur DBMS_PIPE. Pour un canal public utilisant une messagerie persistante et stockant des messages dans le magasin d'objets en nuage, l'utilisateur, la session de base de données, doit disposer du privilège d'exécution sur DBMS_CLOUD et du privilège d'exécution sur l'objet de données d'identification (ou vous pouvez créer un objet de données d'identification autorisé à accéder à l'URI d'emplacement qui contient le message).

Limitation de DBMS_PIPE

L'ensemble DBMS_PIPE ne prend pas en charge l'envoi de messages entre des bases de données qui utilisent des jeux de caractères différents. Par exemple, si vous avez une instance de base de données d'intelligence artificielle autonome qui utilise AL32UTF8 et une autre qui utilise WE8MSWIN1252, vous ne pouvez pas envoyer de messages avec DBMS_PIPE entre ces deux bases de données. Dans ce cas, le système générera l'erreur ORA-12704 si vous tentez d'envoyer des messages avec DBMS_PIPE entre ces deux bases de données.

Pour plus d'informations, voir Sélectionner un jeu de caractères pour une base de données d'IA autonome.

Créer un canal persistant explicite et envoyer un message

Décrit les étapes de création d'un tuyau persistant avec un nom de tuyau spécifié (tuyau explicite).

  1. Stockez vos données d'identification de magasin d'objets à l'aide de la procédure DBMS_CLOUD.CREATE_CREDENTIAL. Exemple :
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'my_persistent_pipe_cred',
        username => 'adb_user@example.com',
        password => 'password'
      );
    END;
    /

    Cette opération stocke les données d'identification dans la base de données dans un format chiffré. Vous pouvez utiliser n'importe quel nom pour les données d'identification. Notez que cette étape n'est requise qu'une seule fois, sauf si les données d'identification du magasin d'objets changent. Après avoir stocké les données d'identification, vous pouvez utiliser le même nom pour accéder au magasin d'objets en nuage afin d'envoyer et de recevoir des messages avec DBMS_PIPE.

    Pour des informations détaillées sur les paramètres, voir ProcédureCREATE_CREDENTIAL. Pour Oracle Cloud Infrastructure Object Storage, il est nécessaire que les données d'identification utilisent l'authentification native d'Oracle Cloud Infrastructure.

    La création de données d'identification pour accéder au magasin d'objets Oracle Cloud Infrastructure n'est pas requise si vous activez les données d'identification du principal de ressource. Pour plus d'informations, voir Utiliser un principal de ressource pour accéder aux ressources Oracle Cloud Infrastructure.

    Note

    Certains outils tels que SQL*Plus et SQL Developer utilisent le caractère esperluette (&) en tant que caractère spécial. Si votre mot de passe contient le caractère esperluette, utilisez la commande SET DEFINE OFF dans ces outils, comme illustré dans l'exemple, pour désactiver le caractère spécial et obtenir les données d'identification créées correctement.
  2. Créez un canal explicite pour envoyer et extraire des messages. Par exemple, créez un canal nommé ORDER_PIPE.
    DECLARE
      r_status INTEGER;
    BEGIN
        r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
    END;
    /

    Pour plus d'informations, voir Fonction CREATE_PIPE.

  3. Vérifiez que le tuyau est créé.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 
  4. Utilisez les procédures DBMS_PIPE pour définir les données d'identification et l'URI d'accès par défaut pour stocker les messages persistants dans le magasin d'objets en nuage.
    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;
    /

    Ces procédures définissent le nom des données d'identification par défaut et l'URI d'emplacement par défaut à utiliser avec les procédures DBMS_PIPE.

    Si vous utilisez Oracle Cloud Infrastructure Object Storage pour stocker des messages, vous pouvez utiliser des URI natifs d'Oracle Cloud Infrastructure ou des URI Swift. Toutefois, l'URI d'emplacement et les données d'identification doivent correspondre au type suivant :

    • Si vous utilisez un format d'URI natif pour accéder à Oracle Cloud Infrastructure Object Storage, vous devez utiliser l'authentification native des clés de signature Oracle Cloud Infrastructure dans l'objet de données d'identification.

    • Si vous utilisez le format d'URI Swift pour accéder à Oracle Cloud Infrastructure Object Storage, vous devez utiliser une authentification par jeton d'authentification dans l'objet de données d'identification.

    Pour plus d'informations, voir Procédure SET_CREDENTIAL_NAME et Procédure SET_LOCATION_URI.

  5. Emballez et envoyez un message sur le tuyau.
    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;
    /

    Pour plus d'informations, voir Procédures PACK_MESSAGE et Fonction SEND_MESSAGE.

Extraire un message persistant sur la même base de données

Décrit les étapes d'extraction d'un message persistant à partir d'un canal explicite sur la même instance de base de données d'intelligence artificielle autonome (instance où le message a été envoyé).

Sur une instance de base de données Autonomous AI Database, vous pouvez recevoir des messages envoyés à un canal à partir d'une autre session. Les procédures DBMS_PIPE sont des procédures de droits de l'appelant et sont exécutées en tant qu'utilisateur appelé courant.

Les tuyaux privés appartiennent à l'utilisateur courant qui crée le tuyau. Les tuyaux privés ne sont accessibles que par le même utilisateur qui a créé le tuyau. Cela s'applique aux canaux utilisant des messages en mémoire et aux canaux utilisant des messages persistants avec des messages stockés dans le magasin d'objets en nuage.

Les canaux publics sont accessibles par toute session de base de données disposant du privilège d'exécution sur DBMS_PIPE. Cela s'applique aux canaux utilisant des messages en mémoire et aux canaux utilisant des messages persistants avec des messages stockés dans le magasin d'objets en nuage.

  1. Vérifiez que le tuyau est créé.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 

    Lorsque vous êtes sur la même instance de base de données d'intelligence artificielle autonome et que le canal existe, vous n'avez pas besoin d'exécuter DBMS_PIPE.CREATE_PIPE avant de recevoir un message. Cela s'applique lorsque le canal a été créé sur la même instance, comme indiqué dans Créer un canal persistant explicite et envoyer un message.

  2. Recevez un message du tuyau.
    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;
    /

    Lorsque vous êtes sur la même instance de base de données d'intelligence artificielle autonome, les données d'identification existent déjà et vous n'avez pas besoin d'exécuter DBMS_CLOUD.CREATE_CREDENTIAL pour recevoir un message. Cela s'applique lorsque le canal a été créé sur la même instance, comme indiqué dans Créer un canal persistant explicite et envoyer un message.

Pour plus d'informations, voir Procédure SET_CREDENTIAL_NAME et Procédure SET_LOCATION_URI.

Pour plus d'informations, voir Fonction RECEIVE_MESSAGE.

Extraire un message persistant en créant un tuyau sur une autre base de données

Décrit les étapes d'extraction d'un message persistant stocké dans le magasin d'objets en nuage avec un canal explicite sur une instance de base de données IA autonome différente de l'instance qui a envoyé le message.

  1. Stockez vos données d'identification de magasin d'objets à l'aide de la procédure DBMS_CLOUD.CREATE_CREDENTIAL. Exemple :
    BEGIN
      DBMS_CLOUD.CREATE_CREDENTIAL(
        credential_name => 'my_persistent_pipe_cred',
        username => 'adb_user@example.com',
        password => 'password'
      );
    END;
    /

    Cette opération stocke les données d'identification dans la base de données dans un format chiffré. Vous pouvez utiliser n'importe quel nom pour les données d'identification. Notez que cette étape n'est requise qu'une seule fois, sauf si les données d'identification du magasin d'objets changent. Une fois les données d'identification stockées, vous pouvez utiliser le même nom pour accéder au magasin d'objets en nuage afin d'envoyer et de recevoir des messages avec DBMS_PIPE.

    Pour des informations détaillées sur les paramètres, voir ProcédureCREATE_CREDENTIAL.

    La création de données d'identification pour accéder au magasin d'objets Oracle Cloud Infrastructure n'est pas requise si vous activez les données d'identification du principal de ressource. Pour plus d'informations, voir Utiliser un principal de ressource pour accéder aux ressources Oracle Cloud Infrastructure.

    Note

    Certains outils tels que SQL*Plus et SQL Developer utilisent le caractère esperluette (&) en tant que caractère spécial. Si votre mot de passe contient le caractère esperluette, utilisez la commande SET DEFINE OFF dans ces outils, comme illustré dans l'exemple, pour désactiver le caractère spécial et obtenir les données d'identification créées correctement.
  2. Créez un canal explicite portant le même nom que le canal qui a envoyé le message. Par exemple, créez un canal nommé ORDER_PIPE.
    DECLARE
      r_status INTEGER;
    BEGIN
        r_status := DBMS_PIPE.CREATE_PIPE(pipename => 'ORDER_PIPE');
    END;
    /
  3. Vérifiez que le tuyau est créé.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    OWNERID NAME       TYPE    
    ------- ---------- ------- 
         80 ORDER_PIPE PRIVATE 
  4. Utilisez les procédures DBMS_PIPE pour définir les données d'identification et l'URI d'accès par défaut pour le magasin d'objets afin que DBMS_PIPE puisse accéder au message persistant.
    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;
    /

    Ces procédures définissent le nom des données d'identification par défaut et l'URI d'emplacement par défaut à utiliser avec les procédures DBMS_PIPE.

    Si vous utilisez Oracle Cloud Infrastructure Object Storage pour stocker des messages, vous pouvez utiliser des URI natifs d'Oracle Cloud Infrastructure ou des URI Swift. Toutefois, l'URI d'emplacement et les données d'identification doivent correspondre au type suivant :

    • Si vous utilisez un format d'URI natif pour accéder à Oracle Cloud Infrastructure Object Storage, vous devez utiliser l'authentification native des clés de signature Oracle Cloud Infrastructure dans l'objet de données d'identification.

    • Si vous utilisez le format d'URI Swift pour accéder à Oracle Cloud Infrastructure Object Storage, vous devez utiliser une authentification par jeton d'authentification dans l'objet de données d'identification.

    Pour plus d'informations, voir Procédure SET_CREDENTIAL_NAME et Procédure SET_LOCATION_URI.

  5. Recevez un message à partir du tuyau persistant.
    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;
    /

    Pour plus d'informations, voir Fonction RECEIVE_MESSAGE.

Supprimer un tuyau persistant

Décrit les étapes de suppression d'un tuyau persistant.

Les canaux persistants envoient et reçoivent des messages en stockant des messages dans le magasin d'objets en nuage. Utilisez DBMS_PIPE.REMOVE_PIPE pour supprimer un canal persistant dans une instance de base de données d'intelligence artificielle autonome.

  1. Appelez la fonction DBMS_PIPE.REMOVE_PIPE pour supprimer un canal.
    DECLARE
       l_result  INTEGER;
    BEGIN
         l_result := DBMS_PIPE.REMOVE_PIPE('ORDER_PIPE');
    END;
    /

    La fonction REMOVE_PIPE supprime le canal de l'instance de base de données d'IA autonome où il s'exécute, mais REMOVE_PIPE n'affecte pas les autres instances de base de données d'IA autonome avec un canal portant le même nom qui utilise le même URI d'emplacement.

  2. Dans l'instance de base de données de l'IA autonome, si vous exécutez DBMS_PIPE.REMOVE_PIPE, vérifiez que le canal est supprimé.
    SELECT ownerid, name, type FROM v$db_pipes 
           WHERE name = 'ORDER_PIPE';
    
    No rows selected