PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 13/03/2011 22:56:16

ph_morville
Membre

Listen & Notify

Bonjour à Tous,

J'essaie en vain d'utiliser Listen et Notify dans le contexte suivant
Un pc (windows)  sur lequel tourne une application de test avec ces quelques lignes, que j'aie reprises de la doc npgsql.

       conn = new NpgsqlConnection("Server=.....etc  ");
       conn.Open();
   
        NpgsqlCommand command = new NpgsqlCommand("listen modif_table;", conn);
        command.ExecuteNonQuery();
       
        conn.Notification += new NotificationEventHandler(NotificationSupportHelper);

        J'ai essayé ici un Select...il fonctionne, la connexion est donc bien valide
        je ne ferme pas la connexion, l'objet conn reste valide durant toute la durée du test
         ......

private void NotificationSupportHelper(Object sender, NpgsqlNotificationEventArgs args)
    {
        listbox.items.add("Notification recue");       
    }



Un serveur (Windows) distant  sur lequel est installé postgresql
       à l'aide de pgAdmin avec l'editeur de requete j'execute:  notify modif_table;    et je ne recois pas la notification sur le poste client.

Notez bien que les 2 machines sont distantes.

Le but est de placer notify dans un trigger, et de recevoir une notification sur une application en cas de modification d'une table bien précise.

Merci de votre aide
Philippe

Hors ligne

#2 14/03/2011 08:49:15

gleu
Administrateur

Re : Listen & Notify

Le coup du NOTIFY dans un trigger fonctionne bien, j'ai déjà eu à utiliser. Maintenant, la partie Npgsql... aucune idée...


Guillaume.

Hors ligne

#3 14/03/2011 09:16:16

Marc Cousin
Membre

Re : Listen & Notify

Je pense que le premier appel à 'listen modif_tables' enregistre le listen. Mais comme écrit dans la doc, la notification n'est réellement reçue qu'à l'ordre SQL suivant (un autre listen par exemple). La réception des listen est par défaut asynchrone. Si vous voulez que cela soit synchrone, je présume que c'est le 'console.readline()' de l'exemple.

Quand on écrit en C, on a une fonction pour savoir s'il y a quelque chose dans la file d'attente : PQnotifies. Apparemment, elle n'est pas accessible dans npgsql. Je présume qu'il l'exécute dans votre dos à chaque exécution d'ordre SQL.

PS: je ne connais pas le driver npgsql, ni .net dans son ensemble, je n'ai donc pas testé dans votre contexte. Mais à la lecture de la doc, et connaissant le fonctionnement habituel de LISTEN/NOTIFY, ça semble logique.


Marc.

Hors ligne

#4 14/03/2011 10:52:34

ph_morville
Membre

Re : Listen & Notify

Effectivement, c'est la compréhension du mode asynchrone qu'il faut assimiler,
Coté poste client il faut:
     ouvrir une connexion
     envoyer une commande listen xxx

Coté serveur
     executer notify xxx sur l'evenement de notre choix

Coté poste client à nouveau
     envoyer une commande sql quelconque  (Select,,,)
     dans ce cas on reçoit bien la notification xxx

Hors ligne

#5 14/03/2011 10:54:31

Marc Cousin
Membre

Re : Listen & Notify

Voila. Sinon dans l'exemple, vous pouvez vous mettre en synchrone, le readline, je présume… à tester. N'hésitez pas à noter les résultats des tests dans le thread, je suis sûr que ça peut intéresser des gens.


Marc.

Hors ligne

#6 14/03/2011 12:20:31

ph_morville
Membre

Re : Listen & Notify

Pour avoir une réponse synchrone il suffit d'ajouter cette ligne dans la chaine de connexion
   SyncNotification=true
Voir ce lien    de Francisco Figueiredo Jr    http://fxjr.blogspot.com/2006/04/synchr … ained.html

Thursday, April 13, 2006
Synchronous notification explained

Hi all,

it seems that my coined feature name "synchronous notification" is confusing everybody. I hope to explain it better now.
.....
It is disabled by default. You can enable it by specifying SyncNotification=true in your connection string.

Hors ligne

#7 14/03/2011 12:28:34

Marc Cousin
Membre

Re : Listen & Notify

Oui. C'est documenté dans l'entête, mais pas dans le paragraphe sur les notifications. Un peu dommage… mais merci pour l'information smile


Marc.

Hors ligne

#8 10/04/2011 19:55:56

ph_morville
Membre

Re : Listen & Notify

Nouveau problème avec Notify

J'ai placé la commande Notify dans un trigger pour chaque Insert/Update d'une certaine table.
Lors de la mise à jour d'UN record, je recois bien de facon synchrone le message de notification dans mon application, un service windows qui tourne sur la meme machine que la base postgresql donc pas de problème lié au réseau du genre Time_out, l'execution coté service a été réduite au minimum, c'est à dire juste enregister un trace dans un fichier.

Lors de la mise à jour de 3 records (voire plus) je recois  UN message de notification en mode synchrone les 2 autres en mode asynchrone !
Pour une investigation plus simple je place depuis l'editeur SQL de pgAdmin les commandes suivantes.
select pg_notify('modif_table', '101');
select pg_notify('modif_table', '102');
select pg_notify('modif_table', '103');     je lance l'execution,   coté application  je recois   101 uniquement

Maintenant je place ces 3 autres commandes
select pg_notify('modif_table', '201');
select pg_notify('modif_table', '202');
select pg_notify('modif_table', '203');      je lance l'execution.... et je recois   102, 103, 201 !

Maintenant je place ces 3 autres commandes
select pg_notify('modif_table', '301');
select pg_notify('modif_table', '302');
select pg_notify('modif_table', '303');     je lance l'execution.... et je recois   202, 203, 301 !    etc...

J'ai essayé de placer des pg_sleep() de 1s de 5 s...  entre chaque commande, juste à la fin...etc sans un meilleur résultat.

Autre information : Version de la base 9.0.3,  de pgAdmin 1.12.2

Y aurait-il une solution ?  Est-ce un bug ?
Merci
Philippe

Hors ligne

#9 12/04/2011 07:26:01

Marc Cousin
Membre

Re : Listen & Notify

Quand on effectue la même chose avec 2 sessions psql, les messages sont bien reçus sur la session qui fait le listen correctement.

À mon avis, vous ne recevez vos notifications que quand vous êtes hors transaction, ce qui est normal (et expliqué dans la doc de la commande notify). La raison est simple: si vous receviez vos notifications alors que vous êtes en cours de transaction, que faire quand celle-ci est annulée ? La remettre dans la liste des notifications à vous transmettre ?


Marc.

Hors ligne

Pied de page des forums