THE ORB
Arrancando el studio

Demasiadas conexiones / la reserva de conexiones se agotó

Demasiadas cosas le preguntaron a la base de datos a la vez y dejó de aceptar más. Suele pegar en tu momento de más gente.

groupsTodo se congela en hora picocodeNecesita un desarrollador

Haz esto primero

Un script le está preguntando muchísimo más de lo debido. Este necesita que alguien encuentre cuál.

bug_reportMejor pega tu consola entera

Qué significa

MySQL rechazó una conexión nueva porque ya está en max_connections, o la reserva de oxmysql no tiene un hueco libre y la espera se agotó. En un servidor en vivo esto aparece como todo lo que depende de la base de datos congelándose a la vez, normalmente en el pico de jugadores.

Qué lo provoca

Ordenado por la frecuencia con la que es la respuesta.

  1. 1

    Una consulta dentro de un bucle de tick

    Un hilo con Wait(0) o un intervalo corto que consulta en cada vuelta. Un bucle así por jugador alcanza para agotar cualquier reserva.

  2. 2

    Consultas en un manejador de conexión de jugador

    playerConnecting se ejecuta por cada entrada; una consulta lenta ahí retiene una conexión durante todo el saludo, y una oleada de entradas las retiene todas.

  3. 3

    La reserva es más chica de lo que el servidor necesita

    Los valores por defecto de oxmysql son modestos. Un servidor de 200 slots que persiste datos por jugador necesita más.

  4. 4

    Consultas largas que retienen conexiones

    Un índice que falta convierte una consulta de 2 ms en una de 2 s, y la conexión queda retenida los 2 s enteros.

  5. 5

    Otra aplicación comparte la instancia de MySQL

    Un panel web, un bot de Discord, phpMyAdmin.

Cómo saber cuál es el tuyo

SHOW PROCESSLIST;

durante el problema. Consultas idénticas repetidas significan un bucle. Valores altos de Time significan índices que faltan. Después mirá qué permite MySQL:

SHOW VARIABLES LIKE 'max_connections';

Dónde mirar

Cualquier CreateThread que consulte, y cada manejador de playerConnecting.

Cómo arreglarlo

Guardá en memoria en vez de consultar dentro de un bucle, subí los techos, e indexá lo que filtrás:

# 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);

¿Sigues atascado en tu propio código?

Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.

bug_reportAbrir el Server Fixer

Para este tipo de error, el Script Optimizer detecta los patrones de consulta que causan esto.

Errores que viajan con este