El servidor MySQL se ha ido
-
26-09-2019 - |
Pregunta
Aquí mi fragmento de código:
query.next();
qDebug()<<query.lastError();
qlonglong res=query.value(0).toLongLong();
qDebug()<<query.lastError();
y el registro correspondiente que tengo:
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, mi programa funciona bien (funciona en un servidor y acepta conexiones de los clientes), pero cada mañana, cuando intenté conectarlo, recibo mensajes anteriores.
¿Cuál puede ser el problema con el servidor MySQL?
Solución
Desde el Manual MySQL:
La razón más común para el servidor MySQL ha desaparecido es que el servidor cronometró y cerró la conexión.
...
Por defecto, el servidor cierra la conexión después de ocho horas si no ha sucedido nada. Puede cambiar el límite de tiempo estableciendo el
wait_timeout
variable cuando comienzas mysqld....
Si tiene un script, solo debe emitir la consulta nuevamente para que el cliente haga una reconexión automática. Esto supone que tiene una reconexión automática en el cliente habilitado (que es el valor predeterminado para el
mysql
Cliente de línea de comandos).
Ver esta página manual Para más detalles sobre este error.
Otros consejos
Sé que esto es antiguo, pero resulta ser el primer éxito de Google para "MySQL Server se ha ido QMYSQL: No se puede ejecutar la consulta".
Parece que qsqldatabase :: isopen () todavía devolverá verdadero a pesar de que ya no tenemos una conexión. Así es como lo capto:
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
}
}
Pude imitar esta situación reiniciando el servidor con "/etc/init.d/mysql reiniciar" y seguir enviando consultas y eventualmente arroja este error. Siento que esto no debería cambiarse del lado del servidor, de hecho, 8 horas parecen extremadamente largas para mantener abierta una conexión inactiva.