这是我的代码段:
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服务器有什么问题?
答案 0 :(得分:2)
来自MySQL Manual:
MySQL服务器消失的最常见原因是服务器超时并关闭了连接。
...
默认情况下,如果没有发生任何事情,服务器会在八小时后关闭连接。您可以在启动mysqld时通过设置
wait_timeout
变量来更改时间限制。...
如果您有脚本,则只需再次发出查询,客户端就可以自动重新连接。这假设您在启用的客户端中具有自动重新连接(这是
mysql
命令行客户端的默认设置)。
有关此错误的详细信息,请参阅this manual page。
答案 1 :(得分:2)
我知道这已经老了,但恰好是第一个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小时似乎非常长,以保持空闲连接打开。