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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top