Вопрос

Здесь мой кодовый фрагмент:

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?

Это было полезно?

Решение

Из Mysql Manual.:

Наиболее распространенная причина для MySQL Server ушла погрешна, заключается в том, что сервер истек и закрыл соединение.

...

По умолчанию сервер закрывает соединение через восемь часов, если ничего не произошло. Вы можете изменить ограничение по времени, установив wait_timeout переменная при запуске mysqld.

...

Если у вас есть скрипт, вам просто нужно снова выдать запрос для клиента, чтобы сделать автоматическую переподключение. Это предполагает, что у вас есть автоматическая переподключение к включению клиента (что по умолчанию для mysql Клиент командной строки).

Видеть Это руководство Для получения более подробной информации об этой ошибке.

Другие советы

Я знаю, что это старое, но оказывается первым ударом Google для «MySQL Server ушел QMysql: невозможно выполнить запрос».

Похоже, QSQLDATATABASE :: ISOPEN () все равно вернутся, даже если у нас больше нет связи. Вот как я его ловлю:

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 часов кажется очень долго, чтобы держать бездействующую связь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top