Vous n'êtes pas identifié(e).
Pages : 1
Oui bien sur, mais c'est déjà mieux que rien, et maintenant à moi de choisir des noms de table judicieusement.
Merci pour la réponse, mais j'ai trouvé une methode pour au moins connaitre toutes les fonctions qui accedent à une table.
Toutes les fonctions sont stockées dans la table "routines" du catalogue, il suffit ensuite de faire un select pour extraire toute celles qui utilisent une table précise.
Exemple avec la table "lot" et comme chaque colonne de chaque table à un préfixe unique alors je peux aussi les récupèrer
select routine_name, routine_definition from information_schema.routines
where specific_schema = 'public' and
routine_definition like '%lot%';
Bonjour
Existe t-il outil permettant de controler la coherence des tables et des fonctions pour traiter le problème suivant:
Utitilisation de pdAdmin
1- Creation d'un table col_a, col_b, col_c
2- Creation d'une fonction (procedure stockée) utilisant la colonne col_b
3- Modification de la fonction, utilisation de col_z, lors de la validation pgAdmin retourne une erreur col_z n'existe pas: (résultat normal )
4- Modification de la table suppression de col_b dans ce cas nous ne sommes pas prévenu que cette colonne est utilisée ailleur.
sauf à passer en revue toutes les fonctions, en y ajoutant un espace par exemple et en validant, la modification sortira en erreur.
Je n'ai pas trouvé d'outil pour controler la cohérence des colonnes entre les tables et les fonctions.
Merci d'avance
Cordialement
Philippe
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
Bonjour
Je reviens sur ce sujet, apres analyse il se trouve qu'un des process potsgres.exe "auto vacuum launcher" consomme 4 ko toutes les 90s, sur un serveur de test contenant 4 bases (postgres + 3 autres bases) et en 1 mois on dépasse les 100Mo.
Environnement Windows serveur 2008 R2, version postgres 9.0.1
Or je viens de trouver sur ce lien http://www.postgresql.org/docs/9.0/stat … 9-0-2.html, la ligne suivante
•Fix long-term memory leak in autovacuum launcher (Alvaro Herrera)
Avez vous déjà constaté ce problème et comment l'avez vous réglé .
Merci pour la réponse
Philippe
Je viens de supprimer ce process, et l'afficheur de performance de windows à diminuer d'autant la mémoire consommée.
Je reviens sur ce problème,
Avec une chaine de connexion contenant "Pooling=false;"
chaque conn.Open() dure 1..2 secondes pour un pc en Workgroup et 20s pour un PC connecté à un domaine.
durant la durée de vie de la connexion on peut voir un process postgres.exe s'executer, consommer de 2 à 5 Mo et disparaitre à la cloture de la connexion.
Avec "Pooling=true;" le process postgres.exe reste toujours présent, il n'y a plus la perte de temps de connexion.
L'application execute TOUJOURS les memes opérations (connection open, select, insert..... close, dispose), seule la chaine de connexion a été modifiée.
Cependant pour chaque opération réalisée, le process postgres.exe s'incrémente de 4 Mo, resultat 15 jours plus tard, le process consomme 100Mo ! Et il n'y a pour le moment qu'un seul poste client avec Pooling= true, tous les autres sont à false.
Donc avec 100 postes client, on a environ 10 process visibles en permance, car tous les process ont une durée de vie de quelques secondes, sauf celui du pooling= true qui a une durée de vie qui semble permante.
Si l'on bascule tous les postes en polling=true alors on va finir par exploser la mémoire.
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.
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
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
Merci Guillaume
Cependant je viens choisir une solution plus radicale, en utilisant lc_messages = 'us_US', ainsi je n'ai plus de problème avec les accents.
Of course, l'utilisateur verra venir les erreurs en anglais.
cordialement
Ph
Note: En version 8.4 les fichiers log sont en ascii
A chaque changement de paramètres je fais un arret / relance du serveur.
Une précision, Sur une autre machine, j'ai encore la version précédente, (postgresql 8.4 et pgAdmin 1.10.0) avec laquelle je n'ai pas cette erreur.
Bien sur j'ai observé les fichiers postgresql.config sans y voir de différence .
En particulier voici les champs de la version 8.4
#client_encoding = sql_ascii # actually, defaults to database
# These settings are initialized by initdb, but they can be changed.
lc_messages = 'French, France' # locale for system error message
lc_monetary = 'French, France' # locale for monetary formatting
lc_numeric = 'French, France' # locale for number formatting
lc_time = 'French, France' # locale for time formatting
Meme avec lc_messages = 'fr_FR.UTF-8' les logs restent en asccii
Voici sa valeur
lc_messages = 'French, France'
Comment y placer UTF8 ?
Merci
Bonjour
Toutes les bases sont codées en UTF8, y compris la base postgres.
Lors de l'utilisation du menu "Outils/Etat du serveur" de pgAdmin celui-ci sort en erreur séquence d'octets invalide pour l'encodage « UTF8 ...
Voici ce que l'on trouve dans les fichiers log (postgresql-xxxx....log)
2011-02-23 20:19:07 CET LOG: le système de bases de données a été arrêté à 2011-02-23 20:18:53 CET
2011-02-23 20:19:50 CET ERREUR: séquence d'octets invalide pour l'encodage « UTF8 » : 0xe86d65
2011-02-23 20:19:50 CET INSTRUCTION : SELECT pg_file_read('pg_log/postgresql-2011-02-23_201907.log', 0, 50000)
Si on execute le select pg_file_read... on obtient directement la meme erreur.
En y regardant de plus pres, c'est en fait la codification des fichiers log qui est en ASCII au lieu d'être codée en UTF8.
Quelqu'un pourrait-il me dire où se trouve le parametre la codification des fichiers log ?
Note : J'ai déjà essayé sans succés :
- Dans postgresql.conf client_encoding = UTF8
- Dans pgAdmin Menu Fichier\preference... Lire et écrire les fichiers au format UTF8
Version de pgAdmin 1.12.1
de postgresql 9.0
Merci pour la réponse
Philippe
Et bien c'est ce que j'aimerais savoir.
cdlt
J'ai activé les traces de npgsql ( NpgsqlEventLog.Level = LogLevel.Debug;) et l'on peut voir que le blocage se trouve dans la classe NpgsqlStartupPacket,
WriteToStream_Ver_3(Stream output_stream)
{
PGUtil.WriteInt32(output_stream, 4 +4 +5...)
....
output_stream.Flush(); c'est cette instruction qui se bloque durant 15..20s
}
Pusique c'est un flush, on peut l'utiliser apres chaque PGUtil.Write... et observer les resultats.
En fait si on place un flush sous le 1er write de cette fonction, celui-ci se bloque mais pas les suivants.
En observant les datagrams sur le réseau on voit que le 1er flush ne se contente pas d'ecricre quelques octets, et je suppose que cela correspond à l'échange des clés pour la mise en oeuvre du SLL.
Bonjour
Postgresql 9.0 est installé sur un server distant (Windows Web Server 2008 R2).
Chaque connexion se fait en SSL
Un programme minimaliste mesure le temps d'ouverture de la connexion
NpgsqlConnection conn = new NpgsqlConnection("ma chaine de connexion...");
conn.Open();
Durée = .......
Lorsque ce programme est installé sur des machines (Windows XP ou VISTA) appartenant à un groupe de travail (WORKGROUP) la durée d'ouverture de la connexion varie entre 2 et 3 secondes.
Lorsque ce programme est installé sur des machines (XP, VISTA) appartenant à un Domaine, la durée d'ouverture varie entre 5s et 15..20s !
5s pour 2 ouvertures rapprochées
20s pour 2 ouvertures situées à 1mn d'écart.
Le test a aussi été réalisé sur la même machine, en lui modifiant ses paramètres (groupe/domaine), avec le meme écart de résultat (2..20s).
Si l'on autorise une connexion NON SSL, la durée d'ouverture se situe dans tous les cas aux environs de 2s.
Quelqu'un aurait-il une explication sur cet écart de temps, et que devrais-je faire pour l'améliorer
Merci pour la réponse.
Philippe
Pages : 1