O MySQL Server foi embora
-
26-09-2019 - |
Pergunta
Aqui meu snippet de código:
query.next();
qDebug()<<query.lastError();
qlonglong res=query.value(0).toLongLong();
qDebug()<<query.lastError();
e o log correspondente que tenho:
Debug: QSqlError(2006, "QMYSQL: Unable to execute query", "MySQL server has gone away")
Warning: QSqlQuery::value: not positioned on a valid record
Debug: QSqlError(2006, "QMYSQL: Unable to execute query", "MySQL server has gone away")
Normalmente, meu programa funciona muito bem (ele funciona em um servidor e aceita conexões de clientes), mas todas as manhãs quando tentei conectá -lo, estou recebendo mensagens acima.
Qual pode ser o problema com o MySQL Server?
Solução
De Manual MySQL:
O motivo mais comum para o servidor MySQL desapareceu é que o servidor cronometrou e fechou a conexão.
...
Por padrão, o servidor fecha a conexão após oito horas, se nada aconteceu. Você pode alterar o limite de tempo definindo o
wait_timeout
variável quando você inicia o MySqld....
Se você tiver um script, basta emitir a consulta novamente para o cliente fazer uma reconexão automática. Isso pressupõe que você tenha uma reconexão automática no cliente ativado (que é o padrão para o
mysql
cliente da linha de comando).
Ver esta página manual Para mais detalhes sobre esse erro.
Outras dicas
Eu sei que isso é antigo, mas é o primeiro sucesso do Google para "o MySQL Server foi embora o QMYSQL: Incapaz de executar a consulta".
Parece que o qsqldatabase :: isopen () ainda retornará verdadeiro, mesmo que não tenhamos mais uma conexão. Aqui está como eu pego:
QSqlDatabase db = QSqlDatabase::database();
QSqlQuery query(db);
QString q = "SELECT * FROM myTable;";
if (!query.exec(q))
{
int err = query.lastError().number();
if (err == 2006) // Might want to do #2013 here also?
{
db.close();
if (db.open() && !query.exec(q))
{
// handle error here we still failed...
}
}
else
{
// handle normal query errors here
}
}
Consegui imitar essa situação reiniciando o servidor com "/etc/init.d/mysql reiniciar" e continuando enviando consultas para ele e, eventualmente, ele lança esse erro. Eu acho que isso não deve ser alterado no lado do servidor; na verdade, 8 horas parecem extremamente longas para manter uma conexão ociosa aberta.