Сервер MySQL ушел
Вот мой фрагмент кода:
query.next();
qDebug()<<query.lastError();
qlonglong res=query.value(0).toLongLong();
qDebug()<<query.lastError();
и соответствующий журнал у меня есть:
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")
Обычно моя программа работает нормально (она работает на сервере и принимает подключения от клиентов), но каждое утро, когда я пытался подключиться к ней, я получаю сообщения выше.
В чем может быть проблема с сервером MySQL?
2 ответа
Из руководства MySQL:
Самая распространенная причина того, что MySQL-сервер исчез из-за ошибки, заключается в том, что сервер отключил тайм-аут и закрыл соединение.
...
По умолчанию сервер закрывает соединение через восемь часов, если ничего не произошло. Вы можете изменить ограничение по времени, установив
wait_timeout
переменная при запуске mysqld....
Если у вас есть сценарий, вам просто нужно снова выполнить запрос, чтобы клиент выполнил автоматическое переподключение. Это предполагает, что у вас включено автоматическое переподключение на клиенте (по умолчанию для
mysql
клиент командной строки).
Смотрите эту страницу руководства для более подробной информации об этой ошибке.
Я знаю, что это старая версия, но, похоже, это первое попадание в Google по запросу "Сервер MySQL пропал. QMYSQL: Невозможно выполнить запрос".
Кажется, QSqlDatabase::isOpen() все равно вернет true, даже если у нас больше нет соединения. Вот как я ловлю это:
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
}
}
Я смог имитировать эту ситуацию, перезапустив сервер с помощью "/etc/init.d/mysql restart" и продолжая посылать запросы к нему, и в конечном итоге он выдает эту ошибку. Я чувствую, что это не должно быть изменено на стороне сервера, на самом деле 8 часов, кажется, очень долго, чтобы поддерживать свободное соединение.