Trop de connexions / pool de connexions épuisé
Trop de choses ont interrogé la base en même temps et elle a cessé d'accepter. Cela tombe en général à votre heure de pointe.
Faites d'abord ceci
Un script interroge beaucoup trop souvent. Celui-ci demande que quelqu'un trouve lequel.
Ce que ça veut dire
MySQL a refusé une nouvelle connexion parce qu'il est déjà à max_connections, ou le pool d'oxmysql n'a plus de place libre et l'attente a expiré. Sur un serveur en production, cela se voit comme tout ce qui dépend de la base qui gèle d'un coup, en général au pic de fréquentation.
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
Une requête dans une boucle de tick
Un thread avec
Wait(0)ou un intervalle court qui interroge à chaque itération. Une seule boucle de ce type par joueur suffit à épuiser n'importe quel pool. - 2
Des requêtes dans un gestionnaire de connexion de joueur
playerConnectings'exécute à chaque arrivée ; une requête lente y retient une connexion pendant toute la poignée de main, et une vague d'arrivées les retient toutes. - 3
Le pool est plus petit que ce dont le serveur a besoin
Les valeurs par défaut d'oxmysql sont modestes. Un serveur de 200 slots avec persistance par joueur en demande plus.
- 4
Des requêtes longues qui retiennent des connexions
Un index manquant transforme une requête de 2 ms en requête de 2 s, et la connexion est retenue pendant toute la durée.
- 5
Une autre application partage l'instance MySQL
Un panneau web, un bot Discord, phpMyAdmin.
Comment savoir laquelle est la vôtre
SHOW PROCESSLIST;
pendant le problème. Des requêtes identiques répétées signalent une boucle. Des Time élevés signalent des index manquants. Regardez ensuite ce que MySQL autorise :
SHOW VARIABLES LIKE 'max_connections';
Où regarder
Tout CreateThread qui interroge la base, et chaque gestionnaire playerConnecting.
Comment la corriger
Mettez en cache au lieu d'interroger dans une boucle, relevez les plafonds, et indexez ce que vous filtrez :
# server.cfg set mysql_connection_string "mysql://user:pass@host/db?connectionLimit=20" -- MySQL SET GLOBAL max_connections = 300; CREATE INDEX idx_users_identifier ON users (identifier);
Toujours bloqué sur votre propre code ?
Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.
bug_reportOuvrir le Server FixerPour ce type d'erreur, le Script Optimizer repère les motifs de requête à l'origine de ceci.