Сервер 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 часов, кажется, очень долго, чтобы поддерживать свободное соединение.

Другие вопросы по тегам