即使 MYSQL_OPT_RECONNECT=1,QSqlDatabase 第一次查询在一段时间不活动后也有空结果集

问题描述

我的数据库应用程序在使用 QsqlDatabase/MariaDB 时遇到了奇怪的行为。

应用程序工作正常,但是当很长时间(比如几个小时)没有发送任何查询时,第一次查询总是返回一个空结果集,没有任何 MysqL 错误。之后,查询再次开始工作......

我这样初始化我的连接:

QsqlDatabase sqldb = QsqlDatabase::addDatabase("QMysqL",connectionName);
sqldb.setHostName(host);
sqldb.setUserName(user);
sqldb.setPassword(password);
sqldb.setDatabaseName(db);
sqldb.setConnectOptions("MysqL_OPT_RECONNECT=1");
sqldb.open();

在每次查询之前,我调用这个方法

bool db::checkopen() {
    if (!sqldb.isopen()) {
        sqldb = QsqlDatabase::database(_conName);

        if (!sqldb.isopen()) {

            std::cerr <<  "Cannot open the database: " << sqldb.databaseName().toUtf8().data() << std::endl;
            std::cerr << "Db error: " <<sqldb.connectionName().toStdString() << " " << sqldb.lastError().text().toStdString() << std::endl;
            std::cerr << "Class db: (checkOpen) cannot open the database";
            return false;
        }
    }
    return true;
}

我如何使用上述示例:

QString db::fetchSingle(QString sqlQuery) {

    QTextStream(stdout) << "db::fetchsingle query: " << sqlQuery << "\n";

    if (!checkopen()){
        QTextStream(stdout) << "db::fetchSingle checkOpen returned false \n";
        return "None";
    }

    QsqlQuery res = QsqlQuery(sqlQuery,sqldb);
    if (!res.next()){
        QTextStream(stdout) << "Returning none because !res.next() \n";
        QTextStream(stdout) << "Last query text: " << res.lastQuery() << "\n";
        QTextStream(stdout) << "Last error: " << sqldb.lastError().text() << "\n";
        return "None";
    }
    else
        return res.value(0).toString();
}

因此,对于一段时间后的第一次查询db::fetchSingle 方法输出输出以下内容

db::fetchsingle query: SELECT MAX(shiftid) FROM tb_shift
Returning none because !res.next()
Last query text: SELECT MAX(shiftid) FROM tb_shift
Last error:

查询本身应该总是产生一个结果,因为它只是一个表中肯定有行的列的最大值。在第一次查询之后,应用程序再次开始正常工作。知道为什么会发生这种情况吗?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)