Frage

Hier mein Code -Snippet:

query.next();
qDebug()<<query.lastError();
qlonglong res=query.value(0).toLongLong();
qDebug()<<query.lastError();

und das entsprechende Protokoll, das ich habe:

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")

Normalerweise funktioniert mein Programm gut (es funktioniert auf einem Server und akzeptiert Verbindungen von Clients), aber jeden Morgen, als ich versucht habe, es zu verbinden, erhalte ich oben Nachrichten.

Was kann das Problem mit MySQL Server sein?

War es hilfreich?

Lösung

Von dem Mysql Handbuch:

Der häufigste Grund für den MySQL -Server ist der Fehler, dass der Server die Verbindung abgestimmt und geschlossen hat.

...

Standardmäßig schließt der Server die Verbindung nach acht Stunden, wenn nichts passiert ist. Sie können das Frist ändern, indem Sie die festlegen wait_timeout Variable, wenn Sie MySQLD starten.

...

Wenn Sie ein Skript haben, müssen Sie die Abfrage nur erneut ausstellen, damit der Client eine automatische Wiederverbindung durchführt. Dies setzt voraus, dass Sie eine automatische Wiederverbindung im Client aktiviert haben (was die Standardeinstellung für die ist mysql Befehlszeilenclient).

Sehen Diese Handbuchseite Weitere Informationen zu diesem Fehler.

Andere Tipps

Ich weiß, dass dies alt ist, aber zufällig der erste Google -Hit für "MySQL Server ist qmysql weggegangen: Abfrage kann nicht ausgeführt werden".

Es scheint, dass QSQLDATABase :: isopen () immer noch wahr zurückkehren wird, obwohl wir keine Verbindung mehr haben. So fange ich es:

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
    }
}

Ich konnte diese Situation nachahmen, indem ich den Server mit "/etc/init.d/mysql neu startete" neu startete und weiterhin Abfragen an sie sendet und schließlich diesen Fehler auswirkt. Ich bin der Meinung, dass dies nicht die Serverseite geändert werden sollte. Tatsächlich scheint 8 Stunden extrem lang, um eine Leerlaufverbindung offen zu halten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top