Mensajes de caché con canalizaciones Singleton
Singleton Pipe es una adición al paquete DBMS_PIPE
que permite almacenar en caché y recuperar un mensaje personalizado y compartir el mensaje en varias sesiones de base de datos con lecturas simultáneas.
Acerca del almacenamiento en caché de mensajes con canalizaciones Singleton
El paquete DBMS_PIPE
tiene una funcionalidad ampliada en Autonomous Database para soportar pipes Singleton.
Un tubo Singleton en DBMS_PIPE
:
-
Proporciona almacenamiento en caché en memoria de datos personalizados mediante mensajes Singleton Pipe.
-
Admite la capacidad de almacenar en caché y recuperar un mensaje personalizado de hasta 32.767 bytes.
-
Soporta el uso compartido de un mensaje almacenado en caché en varias sesiones de base de datos con lecturas simultáneas. Esto proporciona un alto rendimiento y soporta lecturas simultáneas de mensajes entre sesiones de base de datos.
-
Soporta bases de datos de solo lectura y de lectura y escritura.
-
Admite varios métodos de invalidación de la caché:
- Invalidación explícita de caché controlada por el usuario.
- Invalidación de caché después de un intervalo de tiempo especificado por el usuario (en segundos). Este método de invalidación lo controla el remitente del mensaje, mediante el parámetro
shelflife
, en lugar de los lectores de mensajes. Esto evita las trampas comunes debido al uso incorrecto de la caché por parte de los lectores.
Acerca de las tuberías estándar y las tuberías Singleton
El paquete DBMS_PIPE permite que dos o más sesiones de base de datos se comuniquen mediante mensajes en memoria. La funcionalidad de canalización tiene varias aplicaciones, como interfaz de servicio externo, depuración, transacciones independientes y alertas. Consulte DBMS_PIPE en Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 23ai PL/SQL Packages and Types Reference para obtener más información.

Descripción de la ilustración database-pipe-messages-singleton-pipes.eps
Un tubo Singleton puede ser cualquiera de los tipos DBMS_PIPE
admitidos:
- Conducta implícita: se crea automáticamente cuando se envía un mensaje con un nombre de conducto desconocido mediante la función
DBMS_PIPE.SEND_MESSAGE
. - Pipa explícita: se crea mediante la función
DBMS_PIPE.CREATE_PIPE
con un nombre de pipa especificado por el usuario. - Conducta pública: accesible para cualquier usuario con permiso
EXECUTE
en el paqueteDBMS_PIPE
. - Dirección privada: accesible para sesiones con el mismo usuario que el creador de la conducción.
Los pipelines singleton proporcionan la capacidad de almacenar en caché un único mensaje en la memoria de la instancia de Autonomous Database.
A continuación se muestra el flujo de trabajo general para el uso de tuberías singleton.

Descripción de la ilustración singleton-pipe-workflow.eps
Descripción general y características de Singleton Pipe
-
Mensajes Singleton
- Una pipa Singleton puede almacenar en caché un mensaje en la pipa, de ahí el nombre "singleton".
- El mensaje en una tubería única puede estar compuesto por varios campos, hasta un tamaño total de mensaje de 32.767 bytes.
DBMS_PIPE
soporta la capacidad de empaquetar varios atributos en un mensaje mediante el procedimientoDBMS_PIPE.PACK_MESSAGE
.- Para una canalización pública única, cualquier sesión de base de datos con privilegio de ejecución puede recibir el mensaje en el paquete
DBMS_PIPE
. - Para Private Singleton Pipe, el mensaje puede ser recibido por sesiones con el mismo usuario que el creador de Singleton Pipe.
- Alto rendimiento de mensajes para lecturas
- Singleton Pipes almacena en caché el mensaje en el conducto hasta que se invalida o se depura. Las sesiones de base de datos pueden leer simultáneamente un mensaje de Singleton Pipe.
- Recibir un mensaje de un tubo Singleton es una operación sin bloqueo.
- Almacenamiento en Caché de Mensaje
- Un mensaje se almacena en caché en una pipa Singleton mediante
DBMS_PIPE.SEND_MESSAGE
. - Si hay un mensaje en caché existente en Singleton Pipe,
DBMS_PIPE.SEND_MESSAGE
sobrescribe el mensaje anterior para mantener solo un mensaje en Singleton Pipe.
- Un mensaje se almacena en caché en una pipa Singleton mediante
- Invalidación de mensaje
- Invalidación explícita: depura la conducción con el procedimiento
DBMS_PIPE.PURGE
o sobrescribiendo el mensaje medianteDBMS_PIPE.SEND_MESSAGE
. - Invalidación Automática: un mensaje se puede invalidar automáticamente después de que haya transcurrido el tiempo de
shelflife
especificado.
- Invalidación explícita: depura la conducción con el procedimiento
- Sin expulsión de la memoria de la base de datos
- Los pipes Singleton no se expulsan de la memoria de Oracle Database.
- Una pipa Singleton explícita sigue residiendo en la memoria de la base de datos hasta que se elimina mediante
DBMS_PIPE.REMOVE_PIPE
o hasta que se reinicia la base de datos. - Una pipa Singleton implícita permanece en la memoria de la base de datos hasta que hay un mensaje almacenado en caché en la pipa.
Operaciones de tuberías Singleton
Operación | DBMS_PIPE Función o procedimiento |
---|---|
Creación de una Pipa Singleton Explícita |
|
Almacenar en caché un mensaje en Singleton Pipe |
PACK_MESSAGE Procedimientos en Oracle Database 19c PL/SQL Paquetes y Tipos de Referencia o Oracle Database 23ai PL/SQL Paquetes y Tipos de Referencia |
Leer un mensaje en caché de Singleton Pipe |
RECIEVE_MESSAGE Function, UNPACK_MESSAGE Procedures in Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 23ai PL/SQL Packages and Types Reference |
Eliminar un mensaje en Singleton Pipe |
Procedimiento PURGE en la Referencia de tipos y paquetes PL/SQL 19c de Oracle Database o la Referencia de tipos y paquetes PL/SQL de Oracle Database 23ai |
Eliminación de una pipa Singleton explícita |
REMOVE_PIPE Function en Oracle Database 19c PL/SQL Packages and Types Reference o Oracle Database 23ai PL/SQL Packages and Types Reference |
Actualización automática de mensajes en caché con una función de caché
El paquete DBMS_PIPE
permite rellenar automáticamente un mensaje Singleton Pipe mediante una función de caché definida por el usuario.
Por defecto, después de que un mensaje se invalida con una invalidación explícita o implícita de Singleton Pipe, un DBMS_PIPE.RECEIVE_MESSAGE
posterior da como resultado que no se reciba ningún mensaje. Para agregar un nuevo mensaje a la conducción, el mensaje se debe almacenar explícitamente en caché llamando a DBMS_PIPE.SEND_MESSAGE
. Para evitar este caso, en el que no hay ningún mensaje disponible al leer desde una pipa Singleton, puede definir una función de caché. Con una función de caché definida, la función de caché se llama automáticamente cuando recibe un mensaje en los siguientes escenarios:
- Cuando el tubo Singleton está vacío.
- Cuando el mensaje de una pipa Singleton no es válido debido al tiempo transcurrido
shelflife
.
Para utilizar una función de caché, defina la función de caché e incluya el parámetro cache_func
con DBMS_PIPE.RECEIVE_MESSAGE
. Una función de caché definida por el usuario proporciona lo siguiente:
- La función de caché se puede especificar al leer un mensaje de una pipa Singleton mediante
DBMS_PIPE.RECEIVE_MESSAGE
. - Cuando no hay ningún mensaje en Singleton Pipe,
DBMS_PIPE.RECEIVE_MESSAGE
llama a la función de caché. - Cuando ha transcurrido el tiempo del mensaje
shelflife
, la base de datos rellena automáticamente un nuevo mensaje en Singleton Pipe.
El uso de una función de caché simplifica el trabajo con pipas Singleton. No es necesario que maneje casos de fallo para recibir un mensaje de un conducto vacío. Además, una función de caché garantiza que no haya errores de caché al leer mensajes de una pipa Singleton, lo que proporciona el máximo uso del mensaje almacenado en caché.

Descripción de la ilustración automatic-cache-refresh-cache-function.eps
Al definir una función de caché, el nombre de la función debe estar totalmente cualificado con el esquema de propietario:
OWNER.FUNCTION_NAME
OWNER.PACKAGE.FUNCTION_NAME
Defina una función de caché con la siguiente firma:
CREATE OR REPLACE FUNCTION cache_function_name(
pipename IN VARCHAR2
) RETURN INTEGER;
Las operaciones típicas dentro de una función de caché son:
- Cree una pipa Singleton para una pipa explícita mediante
DBMS_PIPE.CREATE_PIPE
. - Cree un mensaje para almacenar en caché en Singleton Pipe.
- Envíe el mensaje al conducto especificado en la función de caché, especificando opcionalmente un
shelflife
para el mensaje implícito.
Para utilizar una función de caché, el usuario de la sesión actual que llama a DBMS_PIPE.RECEIVE_MESSAGE
debe tener los privilegios necesarios para ejecutar la función de caché.
Consulte Función RECIEVE_MESSAGE para obtener más información sobre la definición de una función de caché.
Creación de una Pipa Singleton Explícita
Describe los pasos para crear una pipa Singleton con un nombre de pipa especificado (una pipa Singleton explícita).
En primer lugar, en este ejemplo, cree la función auxiliar receive_message
para llamar repetidamente a DBMS_PIPE.RECEIVE_MESSAGE
. Esto le permite probar la funcionalidad de conducción singleton.
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;
Creación de una Pipa Singleton Explícita con una Función Cache
Describe los pasos para crear una pipa Singleton con un nombre de pipa especificado, una pipa Singleton explícita y proporcionar una función de caché. Una función de caché permite rellenar automáticamente el mensaje en un conducto singleton.