微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决即使 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 举报,一经查实,本站将立刻删除。