MySQLサーバーはなくなりました
-
26-09-2019 - |
質問
ここで私のコードスニペット:
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 Serverの問題は何ですか?
解決
から mysqlマニュアル:
MySQLサーバーの最も一般的な理由は、エラーが発生したことです。これは、サーバーがタイムアウトして接続を閉じたことです。
...
デフォルトでは、何も起こらなかった場合、8時間後にサーバーは接続を閉じます。 設定して時間制限を変更できます
wait_timeout
mysqldを起動するときの変数。...
スクリプトがある場合は、クライアントが自動再接続を行うために再度クエリを発行する必要があります。これは、クライアントに自動再接続が有効になっていることを前提としています(これはデフォルトです
mysql
コマンドラインクライアント)。
見る このマニュアルページ このエラーの詳細については。
他のヒント
私はこれが古いことを知っていますが、たまたま「MySQL Serverが去ったQMYSQL:クエリを実行できない」の最初のGoogleヒットです。
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/mysql再起動」でサーバーを再起動することでこの状況を模倣し、それにクエリを送信し続けることができ、最終的にこのエラーをスローしました。これはサーバー側を変更すべきではないと感じています。実際、8時間はアイドル接続を開いたままにするのに非常に長いと思われます。