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.
Faça isto primeiro
Algum script está perguntando muito mais do que deveria. Esse precisa de alguém para achar qual.
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
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
Consultas num handler de conexão de jogador
O
playerConnectingroda 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
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
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
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 FixerPara esse tipo de erro, o Script Optimizer detecta os padrões de consulta que causam isso.