MySQL服务器已消失
问题描述:
这里我的代码片段: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服务器有什么问题?
答
为MySQL服务器最常见的原因已经消失的错误是服务器超时和关闭连接。
...
默认情况下,如果没有事情发生,服务器关闭8小时后的连接。您可以在启动mysqld时通过设置
wait_timeout
变量来更改时间限制。...
如果你有一个脚本,你必须要为客户做一个自动重新连接再次发出查询。这假设您已启用客户端自动重新连接(这是
mysql
命令行客户端的默认设置)。
有关此错误的更多详细信息,请参阅this manual page。
答
我知道这是旧的,但恰好是第一个谷歌打击“MySQL服务器已经走了QMYSQL:无法执行查询”。
看来QSqlDatabase :: 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重启”的服务器来模拟这种情况,并继续发送查询,并将其最终引发此错误。我觉得这不应该被改变服务器端,事实上8小时似乎非常长的时间保持空闲连接开放。