Zu viele Verbindungen / Verbindungspool erschöpft
Zu viele Dinge haben die Datenbank gleichzeitig angefragt, und sie nimmt nichts mehr an. Das trifft meist deinen Stoßzeitpunkt.
Mach das zuerst
Ein Script fragt viel zu oft an. Hier muss jemand herausfinden, welches.
Was es bedeutet
MySQL hat eine neue Verbindung abgelehnt, weil max_connections erreicht ist, oder der Pool von oxmysql hat keinen freien Platz und das Warten lief ab. Auf einem Live-Server zeigt sich das so, dass alles Datenbankgestützte gleichzeitig einfriert — meist zur Stoßzeit.
Was es auslöst
Sortiert danach, wie oft es die Antwort ist.
- 1
Eine Abfrage in einer Tick-Schleife
Ein Thread mit
Wait(0)oder kurzem Intervall, der bei jedem Durchlauf abfragt. Eine solche Schleife pro Spieler reicht, um jeden Pool leerzuräumen. - 2
Abfragen in einem Spieler-Verbindungs-Handler
playerConnectingläuft bei jedem Beitritt; eine langsame Abfrage hält dort eine Verbindung für den ganzen Handshake, und eine Beitrittswelle hält sie alle. - 3
Der Pool ist kleiner, als der Server braucht
Die Standardwerte von oxmysql sind bescheiden. Ein Server mit 200 Slots und Persistenz pro Spieler braucht mehr.
- 4
Lange Abfragen, die Verbindungen halten
Ein fehlender Index macht aus einer 2-ms-Abfrage eine 2-s-Abfrage, und die Verbindung bleibt die ganzen 2 s belegt.
- 5
Eine andere Anwendung teilt sich die MySQL-Instanz
Ein Webpanel, ein Discord-Bot, phpMyAdmin.
Wie du erkennst, welcher deiner ist
SHOW PROCESSLIST;
während das Problem läuft. Wiederholte identische Abfragen bedeuten eine Schleife. Hohe Time-Werte bedeuten fehlende Indizes. Schau dann, was MySQL erlaubt:
SHOW VARIABLES LIKE 'max_connections';
Wo du nachsehen musst
Jeder CreateThread, der abfragt, und jeder playerConnecting-Handler.
Wie du es behebst
Cache statt in einer Schleife abzufragen, heb die Obergrenzen an, und indiziere, wonach du filterst:
# 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);
Hängst du immer noch an deinem eigenen Code?
Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.
bug_reportServer Fixer öffnenFür diese Art Fehler Script Optimizer erkennt die Abfragemuster, die das verursachen.