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

Delphi Discussion :

problème Access et Mémoire


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut problème Access et Mémoire
    Voilà mon problème ,

    j'ai fait un test en créant une form avec 2 boutons
    1 pour me connecter à une base access 2003 à l'aide ADO
    et l'autre pour fermer la connection

    Je suis sous Delphi 6 Edition Perso

    Bouton 1 :

    {-----------------------------
    //Connection à la base de donnée
    -----------------------------}
    Cnx:= CoConnection.Create ;
    Cnx.Open( 'Provider=Microsoft.Jet.OLEDB.4.0;User ID=Admin; Data Source=C:\Impression_ASW\Impression_Asw.mdb;', '', '', -1 );


    Bouton 2 :

    cnx.close

    Le problème est que après le cnx.close ma base est bien fermée mais l'utilisation mémoire ne diminue pas.Voilà mon problème.

  2. #2
    Membre chevronné

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 292
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 292
    Points : 1 944
    Points
    1 944
    Par défaut
    L'objet créé dans le bouton 1, n'est pas libéré (MonObjet.Free ou FreeAndNil(MonObjet))

    Sinon je ne vois pas où est le souci.
    Est-ce qu'il y a des requtes ou des contrôles BD qui sont actifs avant le Close?

  3. #3
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    le problème c'est que cnx.free ou FreeAndNil (cnx) n'est pas possible car cnx n'est pas un objet (cnx : Connection15)

  4. #4
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    cnx est une interface et n'a donc pas de destructeur (Free ou Destroy) mais ça reste un objet (au sens où ce dernier occupe de la mémoire à une adresse dans le monceau et que la variable cnx est un pointeur vers cette adresse). La mémoire des objets COM est normalement libérée de façon automatique quand il n'y a plus de référence vers l'objet.

    As-tu essayé cnx := nil ?

  5. #5
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    Oui je suis d'accord avec toi mais le problème c'est lorque je me connecte à ma base de donnée Access la mémoire augmente ce qui est normal mais lorsque je ferme ma base avec cnx.close et bien ma base est bien fermée mais la mémoire ne diminue pas.

  6. #6
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    Oui j'ai essayé Cnx : nil ;

    car d'ailleurs j'ai fait le même test en vb avec set cnx=nothing et même topo pour la mémoire est-ce possible que cela vienne d'access ?

  7. #7
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Est-ce que tu teste avec un code minimal ?

    Pour être certain que c'est la connexion le problème faudrait s'assurer que tu n'utilises aucun autre composant et que tout ce que tu fais c'est Open et Close.

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    justement pour tester je ne fais que ça open et close

  9. #9
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    Toujours pas de solution pour mon problème.quelqu'un à une idée

  10. #10
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    A mon humble avis, pour vérifier s'il y a, ou pas, de fuite mémoire, il faut faire de nombreuses connexions et deconnexions avec la meme instance d'application. Si la mémoire augmente une fois, ne redescend pas, mais ne remonte également pas, il n'y a pas de problème en soit.

    Aussi, il ne faut pas oublié qu'il y a du COM derrière tout ça, et que la gestion mémoire n'est probablement pas uniquement gérée par l'application.

  11. #11
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    En effet la mémoire n'augmente q'une seule fois même après plusieurs connection et déconnection ,donc le fait qu'elle ne redescente pas ce serait normal alors.

  12. #12
    Membre éprouvé
    Avatar de neilbgr
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2004
    Messages
    651
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 651
    Points : 1 177
    Points
    1 177
    Par défaut
    C'est mon avis.

  13. #13
    Membre averti
    Avatar de Hauwke
    Inscrit en
    Septembre 2005
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 329
    Points : 400
    Points
    400
    Par défaut
    Citation Envoyé par neilbgr
    C'est mon avis.
    +1
    L'accroissement de la mémoire à l'initialisation de l'objet Com vient directement du système d'exploitation et surtout du moteur Jet.
    A l'initialisation du soft, le SE monte un certain nombre d'élément en mémoire, en particulier, les mécanismes d'accés à l'Iinterface. Ne sachant pas quel sera la suite des appels, le SE travaille selon la loi du "moindre effort". il a fait le boulot une fois et ne va pâs s'amuser à décharger et recharger l'Iinterface tant que le niveau de ressource disponible n'atteint pas un niveau critique. Il va garder l'Iinterface en mémoire au cas ou un autre processus ferait appel à elle... Au second appel, le SE va vérifier dans ses tables d'allocation si les éléments fonctionnels sont présents et va réaffecter les adresses mémoires. Le second lancement devrait être sensiblement plus rapide que le premier.
    Même sans mener de grande expérience sur le sujet, vous pouvez tester en lancant, avant tout autre processus, des logiciels comme Access ou bien Autocad, calculez le temps du premier affichage, refermez l'appli et réouvrez l'appli. La seconde ouverture est plus rapide de 15 à 30%. Il est à noter que Delphi ne peut donner, comme la plus belle fille du monde, que ce qu'il a! Or, les objets Com n'appartiennent pas à Delphi. En l'occurence, Delphi nous offre un moyen d'accés aux Com guère plus...
    Cordialement,
    Hauwke

  14. #14
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 30
    Points : 13
    Points
    13
    Par défaut
    Merci à tous pour ces réponses ,

  15. #15
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 922
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 922
    Points : 15 357
    Points
    15 357
    Par défaut
    Yop !

    La seconde ouverture est plus rapide de 15 à 30%.
    Sans perdre de vue qu'il y a également le cache des disques qui accélère l'ouverture d'une grosse appli.

    Mes 2 cts,
    --
    jp

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

Discussions similaires

  1. FIREBIRD + APPLI EN C : Problèmes de libération mémoire
    Par lio33 dans le forum Connexion aux bases de données
    Réponses: 4
    Dernier message: 16/09/2005, 09h07
  2. Problème de fuite mémoire sur un idFTP
    Par jeromelef dans le forum Composants VCL
    Réponses: 6
    Dernier message: 26/07/2005, 17h29
  3. Problème Access to Sql Server
    Par vuldos dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 26/08/2004, 15h56
  4. Réponses: 25
    Dernier message: 16/07/2003, 20h41
  5. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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