Mise en cache des messages avec des canaux uniques
Singleton Pipe est un ajout au package DBMS_PIPE qui vous permet de mettre en cache et d'extraire un message personnalisé et de partager le message entre plusieurs sessions de base de données avec des lectures simultanées.
A propos de la mise en cache des messages avec des canaux uniques
Le package DBMS_PIPE a étendu les fonctionnalités sur Autonomous AI Database pour prendre en charge Singleton Pipes.
Un tuyau simple dans DBMS_PIPE :
-
Fournit la mise en cache en mémoire des données personnalisées à l'aide des messages Singleton Pipe.
-
Prend en charge la possibilité de mettre en cache et de récupérer un message personnalisé de 32 767 octets maximum.
-
Prend en charge le partage d'un message mis en cache entre plusieurs sessions de base de données avec des lectures simultanées. Cela fournit un débit élevé et prend en charge les lectures simultanées de messages dans les sessions de base de données.
-
Prend en charge les bases de données en lecture seule et en lecture-écriture.
-
Prend en charge plusieurs méthodes d'invalidation du cache :
-
Invalidation de cache explicite contrôlée par l'utilisateur.
-
Invalidation du cache après l'intervalle de temps spécifié par l'utilisateur (en secondes). Cette méthode d'invalidation est contrôlée par l'expéditeur du message, à l'aide du paramètre
shelflife, et non par les lecteurs de message. Cela évite les pièges courants dus à une utilisation incorrecte du cache par les lecteurs.
-
A propos des tuyaux standard et des tuyaux simples
Le package DBMS_PIPE permet à plusieurs sessions de base de données de communiquer à l'aide de messages en mémoire. La fonctionnalité Pipe dispose de plusieurs applications telles que l'interface de service externe, le débogage, les transactions indépendantes et les alertes. Pour plus d'informations, reportez-vous à DBMS_PIPE dans Oracle Database 19c PL/SQL Packages and Types Reference ou Oracle Database 26ai PL/SQL Packages and Types Reference.

Description de l'illustration database-pipe-messages-singleton-pipes.png
Un canal unique peut être l'un des types DBMS_PIPE pris en charge :
-
Tuyau implicite : créé automatiquement lorsqu'un message est envoyé avec un nom de tuyau inconnu à l'aide de la fonction
DBMS_PIPE.SEND_MESSAGE. -
Tuyau explicite : créé à l'aide de la fonction
DBMS_PIPE.CREATE_PIPEavec un nom de tuyau spécifié par l'utilisateur. -
Tuyau public : accessible par tout utilisateur disposant du droit d'accès
EXECUTEsur le packageDBMS_PIPE. -
Tuyau privé : accessible par les sessions avec le même utilisateur que le créateur de pipe.
Les singleton Pipes permettent de mettre en cache un seul message dans la mémoire de l'instance de base de données Autonomous AI.
L'exemple suivant présente le flux de travail général pour l'utilisation de tubes singleton.

Description de l'illustration singleton-pipe-workflow.png ci-après
Présentation et caractéristiques de Singleton Pipe
-
Messages singleton
-
Un canal unique peut mettre en cache un message dans le canal, d'où le nom "singleton".
-
Le message dans un canal unique peut être composé de plusieurs champs, jusqu'à une taille totale de message de 32 767 octets.
-
DBMS_PIPEprend en charge la possibilité de packager plusieurs attributs dans un message à l'aide de la procédureDBMS_PIPE.PACK_MESSAGE. -
Pour un canal unique public, le message peut être reçu par n'importe quelle session de base de données disposant du privilège d'exécution sur le package
DBMS_PIPE. -
Pour Private Singleton Pipe, le message peut être reçu par les sessions avec le même utilisateur que le créateur du Singleton Pipe.
-
-
Débit de messages élevé pour les lectures
-
Singleton Pipes met en cache le message dans le pipe jusqu'à ce qu'il soit invalidé ou purgé. Les sessions de base de données peuvent lire simultanément un message à partir du canal unique.
-
Recevoir un message d'un canal unique est une opération non bloquante.
-
-
Mise en cache des messages
-
Un message est mis en cache dans un singleton pipe à l'aide de
DBMS_PIPE.SEND_MESSAGE. -
S'il existe un message mis en cache dans le canal unique,
DBMS_PIPE.SEND_MESSAGEremplace le message précédent pour ne conserver qu'un seul message dans le canal unique.
-
-
Invalidation du message
-
Invalidation explicite : purge le canal à l'aide de la procédure
DBMS_PIPE.PURGEou en écrasant le message à l'aide deDBMS_PIPE.SEND_MESSAGE. -
Invalidation automatique : un message peut être invalidé automatiquement une fois le temps
shelflifeindiqué écoulé.
-
-
Aucune expulsion de la mémoire de base de données
-
Les singleton Pipes ne sont pas expulsés de la mémoire Oracle Database.
-
Un canal unique explicite continue de résider dans la mémoire de base de données jusqu'à ce qu'il soit enlevé à l'aide de
DBMS_PIPE.REMOVE_PIPEou jusqu'au redémarrage de la base de données. -
Un canal unique implicite reste dans la mémoire de la base de données jusqu'à ce qu'il y ait un message mis en cache dans le canal.
-
Opérations de tuyauterie simple
| Opération | Fonction ou Procédure DBMS_PIPE |
|---|---|
| Créer un singleton explicite | Fonction CREATE_PIPE |
| Mettre en cache un message dans un canal unique | PACK_MESSAGE Procedures dans Oracle Database 19c PL/SQL Packages and Types Reference ou Oracle Database 26ai PL/SQL Packages and Types Reference |
| Lire un message en cache à partir de Singleton Pipe | RECEIVE_MESSAGE Function, UNPACK_MESSAGE Procedures dans Oracle Database 19c PL/SQL Packages and Types Reference ou Oracle Database 26ai PL/SQL Packages and Types Reference |
| Supprimer un message dans le canal unique | PURGE Procedure dans Oracle Database 19c PL/SQL Packages and Types Reference ou Oracle Database 26ai PL/SQL Packages and Types Reference |
| Suppression d'un canal singleton explicite | REMOVE_PIPE Function dans le manuelOracle Database 19c PL/SQL Packages and Types Reference ou Oracle Database 26ai PL/SQL Packages and Types Reference |
Actualisation automatique du message mis en cache avec une fonction de cache
Le package DBMS_PIPE vous permet de remplir automatiquement un message Singleton Pipe à l'aide d'une fonction de cache définie par l'utilisateur.
Par défaut, une fois qu'un message est invalidé avec une invalidation explicite ou implicite de Singleton Pipe, une valeur DBMS_PIPE.RECEIVE_MESSAGE suivante n'entraîne aucun message reçu. Pour ajouter un nouveau message au canal, le message doit être explicitement mis en cache en appelant DBMS_PIPE.SEND_MESSAGE. Pour éviter ce cas, où aucun message n'est disponible lorsque vous lisez à partir d'un canal unique, vous pouvez définir une fonction de cache. Avec une fonction de cache définie, la fonction de cache est automatiquement appelée lorsque vous recevez un message dans les scénarios suivants :
-
Lorsque le singleton pipe est vide.
-
Lorsque le message d'un canal unique n'est pas valide en raison du temps
shelflifeécoulé.
Pour utiliser une fonction de cache, définissez la fonction de cache et incluez le paramètre cache_func avec DBMS_PIPE.RECEIVE_MESSAGE. Une fonction de cache définie par l'utilisateur fournit les éléments suivants :
-
La fonction de cache peut être spécifiée lors de la lecture d'un message à partir d'un canal unique à l'aide de
DBMS_PIPE.RECEIVE_MESSAGE. -
Lorsqu'il n'y a aucun message dans le canal unique,
DBMS_PIPE.RECEIVE_MESSAGEappelle la fonction de cache. -
Lorsque le temps du message
shelflifes'est écoulé, la base de données alimente automatiquement un nouveau message dans le canal unique.
L'utilisation d'une fonction de cache simplifie l'utilisation de singleton pipes. Vous n'avez pas besoin de gérer les cas d'échec pour recevoir un message d'un canal vide. En outre, une fonction de cache garantit qu'il n'y a pas d'échec de cache lorsque vous lisez des messages à partir d'un canal unique, ce qui permet une utilisation maximale du message mis en cache.

Description de l'illustration automatic-cache-refresh-cache-function.png ci-après
Lorsque vous définissez une fonction de cache, le nom de la fonction doit être entièrement qualifié avec le schéma propriétaire :
-
OWNER.FUNCTION_NAME -
OWNER.PACKAGE.FUNCTION_NAME
Définissez une fonction de cache avec la signature suivante :
CREATE OR REPLACE FUNCTION *cache_function_name*(
pipename IN VARCHAR2
) RETURN INTEGER;
Les opérations standard d'une fonction de cache sont les suivantes :
-
Créez un canal unique, pour un canal explicite, à l'aide de
DBMS_PIPE.CREATE_PIPE. -
Créez un message à mettre en cache dans le singleton pipe.
-
Envoyez le message au canal indiqué dans la fonction de cache, en spécifiant éventuellement une valeur
shelflifepour le message implicite.
Pour utiliser une fonction de cache, l'utilisateur de session en cours qui appelle DBMS_PIPE.RECEIVE_MESSAGE doit disposer des privilèges requis pour exécuter la fonction de cache.
Pour plus d'informations sur la définition d'une fonction de cache, reportez-vous à Fonction RECIEVE_MESSAGE.
Créer un singleton explicite
Décrit les étapes à suivre pour créer une canalisation unique avec un nom de canalisation spécifié (une canalisation unique explicite).
Dans cet exemple, créez d'abord la fonction d'aide receive_message pour appeler DBMS_PIPE.RECEIVE_MESSAGE de façon répétée. Cela vous permet de tester la fonctionnalité de canalisation unique.
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;
-
Créez un singleton explicite nommé
PIPE_TESTavec le paramètreshelflifedéfini sur 3600 (secondes).DECLARE l_status INTEGER; BEGIN l_status := DBMS_PIPE.CREATE_PIPE( pipename => 'MY_PIPE1', private => TRUE, singleton => TRUE, shelflife => 3600); END; /Pour plus d'informations, reportez-vous à Fonction CREATE_PIPE.
-
Vérifiez que le singleton pipe est créé.
SELECT name, singleton, type FROM v$db_pipes WHERE name= '&pipename' ORDER BY 1;NAME SINGLETON TYPE -------------------- ---------- ------- PIPE_TEST YES PRIVATE -
Pack et envoi d'un message sur le singleton pipe.
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 ---------- 0Pour plus d'informations, reportez-vous à Procédures PACK_MESSAGE dans Oracle Database 19c PL/SQL Packages and Types Reference ou Oracle Database 26ai PL/SQL Packages and Types Reference et Fonction SEND_MESSAGE.
-
Recevoir un message d'un pipeline singleton.
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 timesLa fonction
receive_messageest une fonction d'aide qui appelleDBMS_PIPE.RECEIVE_MESSAGE. -
Purgez le message et retirez le pipe.
EXEC DBMS_PIPE.PURGE('&pipename'); SELECT DBMS_PIPE.REMOVE_PIPE('&pipename') status FROM DUAL;
Création d'un canal unique explicite avec une fonction de cache
Décrit les étapes à suivre pour créer un canal unique avec un nom de canal spécifié, un canal unique explicite, et fournir une fonction de cache. Une fonction de cache vous permet de remplir automatiquement le message dans un canal unique.
-
Créez une fonction de cache,
test_cache_message, pour un pipeline singleton.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; /Remarque : l'utilisateur de session en cours qui appelle
DBMS_PIPE.RECEIVE_MESSAGEdoit disposer du privilège requis pour exécuter la fonction de cache. -
Réception avec une fonction de cache et confirmation du remplissage du message dans le pipe. Le canal doit exister en tant que canal privé créé dans la fonction de cache.
SELECT * FROM receive_message( pipename => '&pipename', rcv_count => 1, cache_func => 'TEST_CACHE_MESSAGE');MESSAGE --------------- This is a placeholder cache message for an empty pipeLa fonction
receive_messageest une fonction d'aide qui appelleDBMS_PIPE.RECEIVE_MESSAGE. Reportez-vous à Création d'un canal unique explicite pour la définitionreceive_message.Pour plus d'informations, reportez-vous à Fonction CREATE_PIPE.
-
Recevoir sans la fonction de cache pour confirmer que le message persiste dans le canal.
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 pipeLa fonction
receive_messageest une fonction d'aide qui appelleDBMS_PIPE.RECEIVE_MESSAGE. Reportez-vous à Création d'un canal unique explicite pour la définitionreceive_message.Pour plus d'informations, reportez-vous à Fonction CREATE_PIPE.