2010-09-01 145 views
1

这里我的代码片段: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服务器有什么问题?

回答

1

MySQL Manual

为MySQL服务器最常见的原因已经消失的错误是服务器超时和关闭连接。

...

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

...

如果你有一个脚本,你必须要为客户做一个自动重新连接再次发出查询。这假设您已启用客户端自动重新连接(这是mysql命令行客户端的默认设置)。

有关此错误的更多详细信息,请参阅this manual page

2

我知道这是旧的,但恰好是第一个谷歌打击“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小时似乎非常长的时间保持空闲连接开放。