2010-09-01 171 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小時似乎非常長的時間保持空閒連接開放。