THE ORB
Iniciando o studio

Conexões demais / o pool de conexões esgotou

Coisas demais perguntaram ao banco ao mesmo tempo e ele parou de aceitar mais. Costuma bater no seu momento de pico.

groupsTudo congela no picocodePrecisa de um desenvolvedor

Faça isto primeiro

Algum script está perguntando muito mais do que deveria. Esse precisa de alguém para achar qual.

bug_reportMelhor colar o console inteiro

O que significa

O MySQL recusou uma conexão nova porque já está no max_connections, ou o pool do oxmysql não tem uma vaga livre e a espera esgotou. Num servidor no ar isso aparece como tudo que depende do banco congelando de uma vez, normalmente no pico de jogadores.

O que causa isso

Ordenado pela frequência com que é a resposta.

  1. 1

    Uma consulta dentro de um laço de tick

    Uma thread com Wait(0) ou um intervalo curto que consulta a cada volta. Um laço desses por jogador já basta para esgotar qualquer pool.

  2. 2

    Consultas num handler de conexão de jogador

    O playerConnecting roda a cada entrada; uma consulta lenta ali segura uma conexão durante todo o aperto de mão, e uma onda de entradas segura todas.

  3. 3

    O pool é menor do que o servidor precisa

    Os padrões do oxmysql são modestos. Um servidor de 200 slots que persiste dados por jogador precisa de mais.

  4. 4

    Consultas longas segurando conexões

    Um índice faltando transforma uma consulta de 2 ms numa de 2 s, e a conexão fica presa os 2 s inteiros.

  5. 5

    Outro aplicativo compartilha a instância do MySQL

    Um painel web, um bot do Discord, o phpMyAdmin.

Como saber qual é o seu

SHOW PROCESSLIST;

durante o problema. Consultas idênticas repetidas significam um laço. Valores altos de Time significam índices faltando. Depois veja o que o MySQL permite:

SHOW VARIABLES LIKE 'max_connections';

Onde olhar

Qualquer CreateThread que consulte, e cada handler de playerConnecting.

Como consertar

Guarde em memória em vez de consultar dentro de um laço, suba os tetos, e indexe o que você filtra:

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

Ainda travado no seu próprio código?

Esta página é o que esse erro costuma significar. Cole o seu console no Server Fixer e ele vai ordenar tudo o que estiver lá e te dizer o que fazer primeiro; e se você preferir não mexer, o ORBIE consegue consertar o script e te devolver o resource pronto para soltar.

bug_reportAbrir o Server Fixer

Para esse tipo de erro, o Script Optimizer detecta os padrões de consulta que causam isso.

Erros que andam junto com este