Celui-ci me tue. Nous avons une application ASP.NET/Mono sur une base de données MySQL. Depuis des mois, nous sommes assaillis par une occurrence totalement aléatoire mais constante de "Impossible de se connecter à l'un des hôtes MySQL spécifiés". Je ne suis en aucun cas un pro de MySQL, et j'espère qu'il s'agit de quelque chose de stupide.
Spécificités :
MySQL 5.5.17
MySQL Connector/Net 6.4.4
Mono 2.10.8
MonoDevelop 2.8.6.5
Chaîne de connexion : SERVER=localhost,3306;DATABASE=xxx;UID=xxx;PWD=xxx;CONNECTION TIMEOUT=90;Encrypt=false ;
Max_connections est fixé à 150. Il n'y a jamais plus de 5 connexions, et elles sont toutes actives (probablement grâce au pooling).
-
L'application est en C# ASP.NET 3.5. Elle fonctionne depuis des années sous Windows/IIS. Il y a neuf mois, notre marché nous a incités à abandonner Windows, et nous avons donc (facilement, je dois dire) migré l'ensemble vers Mono/Apache.
-
Le problème ne se produit que du côté de Mono, mais c'est un point critique puisque nous avons supprimé notre support Windows.
-
Se produit en moyenne une dizaine de fois par heure, mais l'espacement varie énormément.
-
Le problème a été constaté dans les configurations suivantes :
Ubuntu 11/Apache2/mod_mono
OSX Lion/Apacke2/mod_mono
Serveur de débogage Ubuntu 11/xsp2/MonoDevelop
Serveur de débogage OSX Lion/xsp2/MonoDevelop
-
J'ai joué avec keepalive, wait_timeout, connectionreset, etc. en vain. Les délais ne semblent pas avoir d'effet. L'erreur est instantanée sur conn.open - pas après un délai de connexion.
-
Voici un indice : l'application ne fonctionnera absolument pas avec Pooling=false. Presque toutes les tentatives de connexion échouent. Bien sûr, je veux que le pooling soit activé, mais je ne vois pas pourquoi il ne fonctionnerait pas sans.
-
L'application dispose d'un "battement de cœur" intégré (session de l'utilisateur dans la base de données) - toutes les 2 minutes.
-
Le plus exaspérant de tous ? Ce phénomène ne peut absolument pas être reproduit à la demande dans un environnement en cours d'exécution - il est aléatoire. J'ai examiné la taille des requêtes, les temps d'exécution, etc.
-
Je ne peux y parvenir que dans un seul cas de figure : Au démarrage initial d'un serveur Ubuntu ou OSX, la toute première fois que Mono établit sa première connexion à MySQL - cela se produira à ce moment-là. Après cela, c'est à n'importe qui de deviner.