THE ORB
Studio wird gestartet

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.

groupsAlles friert zur Stoßzeit eincodeBraucht einen Entwickler

Mach das zuerst

Ein Script fragt viel zu oft an. Hier muss jemand herausfinden, welches.

bug_reportFüg lieber deine ganze Konsole ein

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. 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. 2

    Abfragen in einem Spieler-Verbindungs-Handler

    playerConnecting lä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. 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. 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. 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 öffnen

Für diese Art Fehler Script Optimizer erkennt die Abfragemuster, die das verursachen.

Fehler, die mit diesem zusammen auftreten