Notificaci�n As�ncrona

PostgreSQL soporta notificaci�n as�ncrona a trav�s de los comandos LISTEN y NOTIFY. Un servidor registra su inter�s en una condici�n de notificaci�n particular con el comando LISTEN (y puede dejar de escuchar con el comando UNLISTEN). Todos los servidores que est�n escuchando una condici�n de notificaci�n particular recibir�n la notificaci�n as�ncronamente cuando cualquier servidor ejecute un NOTIFY de ese nombre de condici�n. El servidor que realiza la notificaci�n no pasar� ninguna otra informaci�n particular a los servidores que est�n escuchando. Por ello, cualquier dato que deba ser comunicado se transfiere habitualmente a trav�s de una relaci�n de base de datos. Tambi�n habitualmente el nombre de la condici�n es el mismo de la relaci�n asociada, pero no s�lo no es necesario, sino que tampoco lo es que exista ninguna relaci�n asociada.

Las aplicaciones libpq emiten los comandos LISTEN y UNLISTEN como consultas SQL ordinarias. Subsiguientemenet, la llegada de mensajes NOTIFY se puede detectar llamando a PQnotifies().

La segunda muestra de programa da un ejemplo del uso de la notificaci�n as�ncrona.

PQnotifies() actualmente no lee datos del servidor; �nicamente devuelve mensajes previamente absorvidos por otra funci�n libpq. En versiones previas de libpq, la �nica forma de asegurar la recepci�n a tiempo de mensajes NOTIFY era emitir constantemente consultas, incluso vac�as, y comprobar entonces PQnotifies() tras cada PQexec(). Aunque esto funcionaba, se menospreciaba como una forma de malgastar poder de proceso.

Una forma mejor de comprobar los mensajes NOTIFY cuando no se dispone de consultas utilizables es hacer una llamada PQconsumeInput(), y comprobar entonces PQnotifies(). Se puede usar select(2) para esperar la llegada de datos del servidor, no utilizando en este caso potencia de CPU a menos que se tenga algo que hacer. N�tese que esta forma funcionar� correctamente mientras utilice usted PQsendQuery/PQgetResult o s�mplemente PQexec para las consultas. Deber�a usted, sin embargo, recordar comprobar PQnotifies() tras cada PQgetResult o PQexec para comprobar si ha llegado alguna notificaci�n durante el procesado de la consulta.