سؤال

هنا مقتطف الرمز الخاص بي:

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؟

هل كانت مفيدة؟

المحلول

من دليل MySQL:

السبب الأكثر شيوعًا لخادم MySQL قد اختفى هو أن الخادم قد تم توقيته وأغلق الاتصال.

...

بشكل افتراضي ، يغلق الخادم الاتصال بعد ثماني ساعات إذا لم يحدث شيء. يمكنك تغيير المهلة الزمنية عن طريق ضبط wait_timeout متغير عندما تبدأ mysqld.

...

إذا كان لديك برنامج نصي ، فيجب عليك فقط إصدار الاستعلام مرة أخرى للعميل لإعادة الاتصال التلقائي. هذا يفترض أن لديك إعادة توصيل تلقائي في تمكين العميل (وهو الافتراضي ل mysql عميل سطر الأوامر).

نرى هذه الصفحة اليدوية لمزيد من التفاصيل حول هذا الخطأ.

نصائح أخرى

أعلم أن هذا قديم ولكن يصادف أنه أول ضربة لـ Google لـ "MySQL Server قد تختفي 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 ساعات طويلة للغاية للحفاظ على اتصال الخمول.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top