2

ここに私のコードスニペットがあります:

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サーバーの問題は何ですか?

4

2 に答える 2

3

MySQLマニュアルから:

MySQLサーバーがなくなったというエラーの最も一般的な理由は、サーバーがタイムアウトして接続を閉じたことです。

..。

デフォルトでは、何も起こらなかった場合、サーバーは8時間後に接続を閉じます。wait_timeoutmysqldの起動時に変数を設定することにより、制限時間を変更できます。

..。

スクリプトがある場合は、クライアントが自動再接続を実行するために、クエリを再度発行する必要があります。これは、クライアントで自動再接続が有効になっていることを前提としています(これはmysqlコマンドラインクライアントのデフォルトです)。

このエラーの詳細については、このマニュアルページを参照してください。

于 2010-09-01T07:41:17.467 に答える
2

私はこれが古いことを知っていますが、「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/mysqlrestart」を使用してサーバーを再起動し、サーバーにクエリを送信し続けることで、この状況を模倣することができました。最終的にこのエラーがスローされます。これはサーバー側で変更すべきではないと思います。実際、アイドル状態の接続を開いたままにするのに8時間は非常に長いようです。

于 2013-02-25T02:56:43.603 に答える