IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Connexion aux bases de données Firebird Discussion :

FIREBIRD + APPLI EN C : Problèmes de libération mémoire


Sujet :

Connexion aux bases de données Firebird

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Bonjour.

    Je cherche à faire des tests de performances sur une petite base de données FIREBIRD. Pour cela j'ai crée une procédure stockée que j'appelle plusieurs fois par secondes ( nombre d'appels par seconde ajustables ). L'Application est développée en C souS Labwindows/CVI en utilisant le SQL TOOLKIT de National Instrument via driver ODBC Firebird.

    Tout marche OK, sauf qu'a chaque appel de ma PS je vois que la mémoire utilisée croit régulièrement (40Ko environ par appel de PS). Dés que je dépasse la taille de ma RAM cela commence à swapper sur disque et là bien sûr les performances s'écroulent.

    Dés que je me déconnecte de la base de données depuis mon application je vois la mémoire qui se libère.

    Le principe de mon appli est le suivant :
    1) Connexion base de données
    2) déclenchement des appels périodiques d'une procédure stockée ( je laisse tourner un temps indéfini ... ) ==> Mémoire utilisée augmente
    3) arrêt des appels à la procédure stockée ==> mémoire utilisée stabilisée
    4) déconnexion ==> mémoire se libère

    Usuellement, lorsqu'une application exploite une base de données, effectue-t-elle une connexion, déconnexion à chaque fois qu'elle fait une requête vers la BDD, ou ne fait-elle qu'une seule connexion, puis traitement de plusieurs requêtes et finalement déconnexion ?

    J'ai tenté la première solution pour le principe mais les peformances sont alors trés réduites.

    J'aimerai avoir votre avis là-dessus.

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 901
    Points : 6 026
    Points
    6 026
    Par défaut
    S'agissant d'une appli avec inter-actions fortes (=fréquentes) entre le client et le serveur, il est préférable de n'avoir qu'une connexion.
    "Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
    -----------------------
    Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
    Usus magister est optimus

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut
    Bonjour.

    C'est effectivement ce que réalise mon application de test.
    En fait le code utilisé pour l'appel à la procédure stockée réserve de la mémoire et ne la libère pas en final. Je l'ai optimisé car je répétais des instructions qui n'étaient pas nécessaire mais maintenant il est assez réduit.

    Voici ce que cela donne si jamais cela interpelle un auditeur de ce forum :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /* Set the parameters */
    resCode = DBSetParamInt (hstmt, 1, valeurS);
    resCode = DBSetParamInt (hstmt, 2, valeurE);
    resCode = DBSetParamInt (hstmt, 3, idUTC);
    resCode = DBSetParamInt (hstmt, 4, idACCES);
    resCode = DBSetParamChar (hstmt, 5, mapDateTime, "yyyy/m/d h:i:s");
    /* Execute the statement. */
    resCode = DBExecutePreparedSQL (hstmt);
    resCode = DBClosePreparedSQL (hstmt);

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    610
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Octobre 2003
    Messages : 610
    Points : 213
    Points
    213
    Par défaut
    Problème résolu, ci-joint code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    resCode = DBSetAttributeDefault (hdbc, ATTR_DB_COMMAND_TYPE,DB_COMMAND_STORED_PROC);
    hstmt = DBPrepareSQL (hdbc, "PR_MAJ_PASSAGE");
    resCode = DBSetAttributeDefault (hdbc, ATTR_DB_COMMAND_TYPE,DB_COMMAND_UNKNOWN);
    /* Refresh the parameters from the stored procedure. */
    resCode = DBRefreshParams (hstmt);
     
    /* Set the input parameters  */
    resCode = DBSetParamInt (hstmt, 1, valeur1);
    resCode = DBSetParamInt (hstmt, 2, valeur2);
    resCode = DBSetParamInt (hstmt, 3, valuer3);
     
    /* Execute the statement. */
    resCode = DBExecutePreparedSQL (hstmt);
     
    /* Pour libérer des ressources proprement */
    resCode = DBDeactivateSQL(hstmt);
    Désormais la mémoire reste stable !

  5. #5
    Membre éprouvé
    Avatar de Andry
    Profil pro
    Informaticien
    Inscrit en
    Juillet 2002
    Messages
    1 164
    Détails du profil
    Informations personnelles :
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Informaticien

    Informations forums :
    Inscription : Juillet 2002
    Messages : 1 164
    Points : 1 181
    Points
    1 181
    Par défaut
    Effectivement,
    La préparation d'un ordre SQL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hstmt = DBPrepareSQL (hdbc, "PR_MAJ_PASSAGE");
    requert du ressource que tu dois desaloué des que tu as fini ton traitement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    resCode = DBDeactivateSQL(hstmt);
    Avec Delphi, l'appel à Prepare doit s'utiliser avec l'appel à Unprepare à la fin du traitement pour liberer la mémoire sinon on risque de saturer la mémoire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    try
     Query.prepare
    // Traitement
     
    finally
      Query.unprepare
    A+
    On progresse .....

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. DataGridView et WPF problème de libération mémoire
    Par fterf dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 12/03/2009, 08h41
  2. Problème de libération mémoire
    Par boule_t dans le forum ActionScript 3
    Réponses: 2
    Dernier message: 16/02/2009, 09h43
  3. Problème de libération de mémoire
    Par saturne13 dans le forum Linux
    Réponses: 9
    Dernier message: 06/02/2007, 09h18
  4. Problème de libération mémoire
    Par chrono23 dans le forum C++
    Réponses: 16
    Dernier message: 07/09/2006, 23h18
  5. [Debutant(e)]problème de libération de mémoire
    Par skywalker3 dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 10/02/2005, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo