Eu tenho essa pergunta feita, mas depois de uma investigação mais profunda, percebi que o enforcamento não é o problema. Depois de ler este tópico , decidi fazer uma nova pergunta.
Por exemplo, passo essa string para a mysql_query()
função:
SELECT 1
Quando executo vários milhares desse comando mysql_query()
, o comando NÃO é enviado ao servidor MySQL!
Verifiquei o arquivo de log do MySQL e não acreditei, mas o comando não estava lá e, portanto mysql_query()
, nunca retorna porque não recebe nenhuma resposta do servidor.
O MySql está gravando o comando no arquivo de log ANTES de ser executado. Eu tentei com SELECT SLEEP(10)
.
Observação:
Eu sei, isso significa muito, mas funcionou por 3 anos sem nenhum problema no SLES 11.3/XenServer 6.5. Nota: Este é um MCVE onde não funciona tão bem!
Desde que o mudei para o SLES 12.3 e XenServer 7.4, os problemas começaram.
O código C++ é muito simples - eu o verifiquei por 3 semanas antes de escrever esta pergunta. O ponto é que esse problema começa após ~ 10 mil consultas. A VM ainda tem ~ 3 GB de RAM livre.
Nota sobre um MCVE:
Criei um MCVE que funciona para mais de 500k execuções do comando MySQL.
Quando insiro este código MCVE no meu projeto e comento o meu existente main()
para executar a função principal do MCVE, depois de alguns milhares [ou mesmo apenas centenas] de execuções, de repente o comando MySQL não é enviado novamente ao servidor MySQL.
Para ser mais específico: Somente objetos estáticos do meu projeto são inicializados antes da execução do MCVE incorporado.
Isso deve ser algo muito estranho em relação a essas inicializações estáticas porque nenhuma outra linha de código está sendo executada.
Pergunta:
alguma ideia do que está acontecendo? Especialmente o fato de que o comando aparentemente [por que eu deveria duvidar do arquivo de log do MySQL Server] não enviado do cliente C API para o servidor MySQL está realmente me incomodando.
Dados técnicos:
- SLES 12.3 rodando no XenServer 7.4 como VM
- Compilado com
gcc
7.3 usando-std=c++17
e quase todas as opções de aviso. - Usando o SLES 12.3 glibc 2.22 padrão com todas as atualizações do SLES instaladas.
- Conectando-se ao MySQL Community Server 5.7.21
- Cliente API C 5.7.21
O usuário Gerard H Pille me deu a dica correta - veja o chat .
Eu tive que remover a
MYSQL_OPT_RECONNECT
configuração e agora funciona. O programa funciona agora por mais de 2 meses sem nenhum problema 1 .Foram essas 2 linhas de código de acordo com o MCVE:
Por que a configuração está causando esse problema, não posso responder.
Novos resultados do teste: MySQL C API 8.0.11 não tem mais esse problema.
1 Agora, ele funciona por mais de 1 ano sem nenhum problema.