2

这是我的代码片段:

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服务器可能有什么问题?

4

2 回答 2

3

来自MySQL 手册

MySQL server has gone away 错误最常见的原因是服务器超时并关闭了连接。

...

默认情况下,如果没有发生任何事情,服务器会在八小时后关闭连接。wait_timeout您可以在启动 mysqld 时通过设置变量来更改时间限制。

...

如果您有脚本,您只需再次发出查询,客户端即可自动重新连接。这假设您在客户端启用了自动重新连接(这是mysql命令行客户端的默认设置)。

有关此错误的更多详细信息,请参阅此手册页

于 2010-09-01T07:41:17.467 回答
2

我知道这很旧,但恰好是“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 小时似乎非常长,以保持空闲连接打开。

于 2013-02-25T02:56:43.603 回答