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 Re : Général » Coherence des colonnes » 10/08/2011 18:23:56

Oui bien sur, mais c'est déjà mieux que rien, et maintenant à moi de choisir des noms de table judicieusement.

#2 Re : Général » Coherence des colonnes » 10/08/2011 17:41:54

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%';

#3 Général » Coherence des colonnes » 10/08/2011 13:31:09

ph_morville
Réponses : 4

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

#4 Re : Général » Listen & Notify » 10/04/2011 19:55:56

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

#5 Général » Fuite de mémoire » 19/03/2011 12:16:02

ph_morville
Réponses : 3

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

#6 Re : Général » Durée d'une ouverture de connexion via npgsql et ssl » 14/03/2011 21:31:26

Je viens de supprimer ce process, et l'afficheur de performance de windows à diminuer d'autant la mémoire consommée.

#7 Re : Général » Durée d'une ouverture de connexion via npgsql et ssl » 14/03/2011 21:11:47

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.

#8 Re : Général » Listen & Notify » 14/03/2011 12:20:31

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.

#9 Re : Général » Listen & Notify » 14/03/2011 10:52:34

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

#10 Général » Listen & Notify » 13/03/2011 22:56:16

ph_morville
Réponses : 8

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

#11 Re : Général » menu Outils/Etat du serveur ---> ERREUR séquence invalide UTF8 » 24/02/2011 12:56:30

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

#13 Re : Général » menu Outils/Etat du serveur ---> ERREUR séquence invalide UTF8 » 24/02/2011 11:17:15

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

#14 Re : Général » menu Outils/Etat du serveur ---> ERREUR séquence invalide UTF8 » 24/02/2011 10:52:36

Meme avec  lc_messages = 'fr_FR.UTF-8'   les logs restent en asccii

#15 Re : Général » menu Outils/Etat du serveur ---> ERREUR séquence invalide UTF8 » 23/02/2011 23:29:04

Voici sa valeur
lc_messages = 'French, France'

Comment y placer UTF8 ?

Merci

#16 Général » menu Outils/Etat du serveur ---> ERREUR séquence invalide UTF8 » 23/02/2011 22:21:27

ph_morville
Réponses : 10

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

#18 Re : Général » Durée d'une ouverture de connexion via npgsql et ssl » 22/02/2011 13:01:34

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.

#19 Général » Durée d'une ouverture de connexion via npgsql et ssl » 22/02/2011 12:38:29

ph_morville
Réponses : 8

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

Pied de page des forums

Propulsé par FluxBB