Problème de connexion avec le serveur MySQL [Résolu]

figoleparigo 8 Messages postés jeudi 17 juillet 2008Date d'inscription 29 juin 2011 Dernière intervention - 23 nov. 2009 à 16:21 - Dernière réponse : figoleparigo 8 Messages postés jeudi 17 juillet 2008Date d'inscription 29 juin 2011 Dernière intervention
- 1 déc. 2009 à 09:49
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.

------- Un bout de code:
Voilà le code pour me connecter au démarrage du Service:

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:

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;

--------- Autre point, la limite de l'utilisateur:
J'ai regardé les paramètres (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.
Afficher la suite 

3 réponses

Répondre au sujet
figoleparigo 8 Messages postés jeudi 17 juillet 2008Date d'inscription 29 juin 2011 Dernière intervention - 1 déc. 2009 à 09:49
+3
Utile
J'ai enfin trouvé la cause de mon problème de déconnexions intempestives. (au cas où ça intéresserait quelqu'un...)

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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de figoleparigo
Oniria 297 Messages postés dimanche 14 mars 2004Date d'inscription 18 décembre 2014 Dernière intervention - 27 nov. 2009 à 22:08
0
Utile
Bonjour,

une idée : est-ce qu'en mettant une petite tempo entre les UPDATE, est-ce que ca ne résoudrait pas ton problème ? Car il est possible que tu dépasses la puissance de MySQL. Ce n'est pas sur mais essaye de mettre des tempos entre chaque UPDATE et tu verras si ca arrange ton cas.

Bon courage


Oniria
Commenter la réponse de Oniria
figoleparigo 8 Messages postés jeudi 17 juillet 2008Date d'inscription 29 juin 2011 Dernière intervention - 28 nov. 2009 à 11:36
0
Utile
Bonjour Oniria,

Merci beaucoup pour ta réponse.
J'ai essayé de mettre un compteur qui va jusqu'à 10000, pour ralentir le code entre requête, mais j'ai toujours les problèmes de coupure de connexion... C'est délirant.
J'ai essayé de modifier les paramètres du serveur (my.ini), en mettant tout au max ou tout au min, rien à faire...

Par contre, j'ai fait une autre petite appli à coté qui fait 20000 INSERT / UPDATE dans la même table et il n'y a aucune erreur ni aucune rupture de connexion. Étrange hein?

Stef
Commenter la réponse de figoleparigo

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.