Vous n'êtes pas identifié(e).
Pages : 1
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
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
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
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
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
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
Oui. C'est documenté dans l'entête, mais pas dans le paragraphe sur les notifications. Un peu dommage… mais merci pour l'information
Marc.
Hors ligne
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
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
Pages : 1