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

Bases de données Delphi Discussion :

Problème de coupure de connexion avec MySQL


Sujet :

Bases de données Delphi

  1. #1
    Invité
    Invité(e)
    Par défaut Problème de coupure de connexion avec MySQL
    Bonjour à tous,

    Je travaille sur un service Windows en Delphi/Pascal et j'utilise une BD MySQL pour traiter des données.
    J'utilise mysql.pas + libmysql.dll pour discuter avec la base et ça fonctionne plutôt bien.
    Mais voilà, quand je lance le service qui doit faire des UPDATE et des INSERT par centaines, j'ai l'erreur suivante au bout de qq dizaines d'INSERT/UPDATE (réalisé avec succès en plus):
    "Lost connection to MySQL server at 'reading initial communication packet', system error: 0" et je perds la connexion, que je relance et qui retombe etc...

    J'utilise Wamp2.0i, et je me connecte sans problème à la base au démarrage, et je fais des SELECT à profusion sans aucun soucis.

    Quelqu'un aurait-il une idée car je sèche un peu...?

    D'avance merci.

    Stef.

  2. #2
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2009
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 168
    Points : 120
    Points
    120
    Par défaut
    Un petit bout de code peu être ? =)

  3. #3
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 458
    Points : 24 871
    Points
    24 871
    Par défaut
    Ton utilisateur n'aurait pas une limite "MAX UPDATES PER HOUR"
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par 0x44-0x43-0x53-0x43 Voir le message
    Un petit bout de code peu être ? =)
    Je ne l'ai pas sous la main là, je suis chez moi.
    Mais j'utilise les fonctions standards "mysql_real_connect(...localhost...)" pour me connecter et "mysql_real_query..." pour faire les UPDATE et INSERT.
    Rien de particulier, mais lundi je posterai un bout de code si ça peut aider...

    Voilà le code pour me connecter au démarrage du Service:

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    function DBConnect : boolean;
    begin
      Result := false;
     
      // Init des paramètres pour le serveur MySQL
      if mySQL_Res <> nil then
        mysql_free_result(mySQL_Res);
     
      mySQL_Res := nil;
      if mySQLhandle <> nil then
      begin
        mysql_close(mySQLhandle);
        mySQLhandle := nil;
      end;
     
      // Init du serveur MySQL
      mySQLhandle := mysql_init(nil);
      if mySQLhandle = nil then
      begin
        Verbose(VRB_ERROR, '*** mysql_init failed !!! ***', []);
        Result := false;
        Exit;
      end;
     
      // Tentative de connexion à la base de données
      if mysql_real_connect(mySQLhandle, pChar(CfgCampi.GetMgrServerHost), pChar(CfgCampi.GetMgrDbUsername),
                            pChar(CfgCampi.GetMgrDbUserpass), pChar(CfgCampi.GetMgrDbPath), 0, nil, CLIENT_MULTI_STATEMENTS) = nil then
      begin
        Verbose(VRB_ERROR, '*** Connexion to database failed !!! ***', []);
        Verbose(VRB_ERROR, 'MySQL Error: %s', [UnicodeString(mysql_error(mySQLhandle))]);
        Result := false;
        Exit;
      end
      else
      begin
        Verbose(VRB_INFO, 'Connected to MySQL server: %s', [UnicodeString(mysql_get_server_info(mySQLhandle))]);
      end;
     
      // Fonction à lancer après chaque connexion
      if (mysql_set_character_set(mySQLhandle, pChar('UTF8')) <> 0) then
      begin
        Verbose(VRB_ERROR, 'MySQL Error: %s', [UnicodeString(mysql_error(mySQLhandle))]);
      end;
     
      Result := not (Result);
    end;
    Voilà la fonction que j'utilise pour les INSERT/UPDATE:

    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
    17
    18
    19
    20
    21
    22
    procedure mysql_insertdata(query : string);
    begin
      // Test la connexion à la base
      if not DBConnected then     // Utilise mysql_ping pour tester la connexion
        Exit;
     
      try
        // Execute la requête
        if mysql_real_query(mySQLhandle, PAnsiChar(query), Length(query)) <> 0 then
        begin
          Verbose(VRB_ERROR, 'MySQL Error: %s', [UnicodeString(mysql_error(mySQLhandle))]);
        end;
     
      except
        on e: Exception do
        begin
          Verbose(VRB_ERROR, '---- Exception inserting qry : %s', [query]);
          Verbose(VRB_ERROR, 'MySQL Error: %s', [UnicodeString(mysql_error(mySQLhandle))]);
          Verbose(VRB_ERROR, '%s', [e.Message]);
        end;
      end;
    end;
    Dernière modification par ero-sennin ; 25/11/2009 à 17h18. Motif: Ajout balise [CODE] (bouton #)

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Ton utilisateur n'aurait pas une limite "MAX UPDATES PER HOUR"
    Quel est donc ce fameux paramètre?? C'est dans la table "users" de mysql?
    En tout cas c'est une remarque très intéressante, je vais vérifier ça dès mon retour au boulot...

    ------------------
    De retour au front, j'ai regardé ce paramètre ainsi que ces copains (max_connections, max_updates, max_user_connections, max_questions) et ils sont tous à 0.
    Ça veut dire qu'ils sont illimités, d'après la doc MySQL.
    Dernière modification par Invité ; 23/11/2009 à 10h15.

  6. #6
    Membre actif

    Inscrit en
    Juin 2009
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 99
    Points : 228
    Points
    228
    Par défaut
    Bonjour

    Il est possible que ce soit une différence de version entre l'unité et la dll, dans ce cas regarde du coté de mysql.pas & libmysql.dll vérifie que tu utilise les bonnes versions.

    Pour être plus sur essaye la version d'évaluation de ces composants MyDAC, ils sont normalement maintenus à jour.

    A+

  7. #7
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 458
    Points : 24 871
    Points
    24 871
    Par défaut
    Je confirme, ils sont maintenus, je les utilise sur 4.1, 5.0 et 5.1 de MySQL !

    Avec MyDAC, j'ai eu des messages similaires lorsque je mélangeais des TMyConnexion d'un Thread à un autre, ce que je ne fais plus, je créé un TMyConnexion par Thread, pour toi c'est ton "mySQLhandle"

    Sinon, j'ajoutais en utilisation de la DLL en MySQL.pas (je m'étais fait une petite classe utilisant le TClientDataSet)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    FConnexion := mysql_init(nil);
     
    ...
    mysql_options(FConnexion, MYSQL_OPT_CONNECT_TIMEOUT, PChar(FTimeOut))
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #8
    Invité
    Invité(e)
    Par défaut
    Merci à la personne qui a modifié l'affiche du code. C'est beaucoup plus lisible comme ça.

    Merci pour vos suggestions, ça me redonne quelques pistes à approfondir.
    Le fichier "libmysql.dll" date du 17/06/2009 et le fichier "mysql.pas" du 04/08/2009. Donc je pense qu'ils sont bien à jour.

    Je vais tester MyDAC pour voir si le problème persiste. Je vous tiens au courant.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je n'ai pas encore essayé avec les composants MyDAC, mais j'ai fait une petite appli de test à coté, qui fait 20000 insertions, updates et appels de procédures stockées.
    Ca prend un peu de temps (40mn, c'est bizarre d'ailleurs) et aucune erreur dans les logs, pas de déconnexion.

    Ce qui innocente le serveur MySQL et la librairie (mysql.pas + libmysql.dll), non?

    Je vais voir du côté de mon code, mais vraiment je vois pas ce qui peut coincer.
    A suivre...

  10. #10
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 458
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 458
    Points : 24 871
    Points
    24 871
    Par défaut
    Je te confirme, c'est très lent, 40 minutes, c'est le temps pour restaurer un Dump de 1Go (par MySQLAdministrator) sur mon vieux MySQL 4.1, et cela représente bcp plus !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  11. #11
    Invité
    Invité(e)
    Par défaut Problème résolu !!
    J'ai enfin trouvé la cause de mon problème de déconnexions intempestives.

    Dans mon service Windows, j'ai un Timer qui se déclenche toutes les 3s pour rythmer les threads de traitement des données. Et dans ce timer, je fais un "mysql_ping" pour tester la connexion avec le serveur MySQL.

    Quand le ping arrive pendant que le serveur traite une requête, "BOOM!!" ça explose....
    Donc maintenant je vérifie qu'aucun thread ne travaille avant de faire le ping, et tout va bien...
    Plus de déconnexion!!

    Leçon à retenir; ne jamais faire de "mysql_ping" en même temps qu'un "mysql_real_query"...

    Merci bcp pour votre participation...

    Stef.

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

Discussions similaires

  1. Problème de connexion avec MySQL
    Par batou22003 dans le forum JDBC
    Réponses: 1
    Dernier message: 17/06/2011, 15h27
  2. Problème coupure de connexion avec MySQL
    Par Invité dans le forum MySQL
    Réponses: 1
    Dernier message: 23/11/2009, 11h39
  3. problème de connexion avec Mysql
    Par guy_antoine_mav dans le forum JDBC
    Réponses: 2
    Dernier message: 01/09/2008, 10h36
  4. [DW MX] problèmes de connexion avec MySQL
    Par acheo dans le forum Dreamweaver
    Réponses: 4
    Dernier message: 08/11/2007, 10h37
  5. Problème de connexion avec MySQL
    Par Tigrounette dans le forum JDBC
    Réponses: 2
    Dernier message: 18/05/2007, 18h54

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