在这里,我的代码片段:

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 Server有什么问题?

有帮助吗?

解决方案

来自 MySQL手册:

MySQL Server的最常见原因已经消失了错误,即服务器计时并关闭了连接。

...

默认情况下,如果没有发生任何事情,服务器将在八个小时后关闭连接。 您可以通过设置 wait_timeout 启动mySQLD时可变。

...

如果您有一个脚本,则只需要再次发布查询才能使客户端进行自动重新连接即可。这是假设您在启用客户端中具有自动重新连接(这是 mysql 命令行客户端)。

此手册页 有关此错误的更多详细信息。

其他提示

我知道这是旧的,但恰好是“ MySQL Server已经消失了Qmysql:无法执行查询”的第一个Google命中。

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小时似乎很长,可以保持空闲连接的打开状态。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top