在没有MYSQL_OPT_RECONNECT的情况下处理MySQL(MariaDB)数据库的重新连接

Handling reconnection of MySQL (MariaDB) database without MYSQL_OPT_RECONNECT

提问人:Mark 提问时间:10/30/2023 最后编辑:Mark 更新时间:10/30/2023 访问量:38

问:

目前我有这个代码:

Orders::Orders(QObject *parent) : QObject{parent}
{
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL", "orders");
    db.setHostName("localhost");
    db.setDatabaseName("database");
    db.setUserName("user");
    db.setPassword("password");
    db.setConnectOptions("MYSQL_OPT_RECONNECT=TRUE;");
    db.open();

    _model = new QSqlTableModel(this, db);
    _model->setTable("orders");
    _model->setEditStrategy(QSqlTableModel::OnManualSubmit);
    _model->select();
}

在 Ubuntu 22.10、Qt 6.4.0 和 MariaDB v15.1 上运行。 在运行时,我收到以下警告:

警告:MYSQL_OPT_RECONNECT 已弃用,并将在将来的版本中删除。

在这里读到他们决定完全删除自动连接功能。 我还搜索了其他问题,比如这个和这个但它们只关注警告本身。

我很好,我可以删除该选项,但我不明白我应该如何处理重新连接。

例如,这是我依赖于数据库访问的函数之一:

void Orders::setOrderState(QString machine, QString id, DbOrderStates state)
{
    QSqlDatabase db = QSqlDatabase::database("orders");
    QString sql = QString("UPDATE orders SET states_id=:state WHERE id=:id AND machine=:machine");
    QSqlQuery query(db);
    query.prepare(sql);
    query.bindValue(":state", static_cast<int>(state));
    query.bindValue(":id", id);
    query.bindValue(":machine", machine);
    query.exec();
}

当我执行这个函数时,我想确保数据库已连接。我该怎么办?我必须检查 的返回值,如果失败,我必须重新连接到阻止执行此函数的数据库?prepare()

我没有找到来自QSqlDatabase的信号,该信号告诉我连接何时断开。

此外,我了解到我不能使用,因为它只是在数据库打开时返回,而不是在调用时连接仍处于打开状态。QSqlDatabase::isOpen()

qt mysql连接器 qsqldatabase

评论

0赞 chehrlic 10/30/2023
您应该询问 mysql 人员如何更改它 - MYSQL_OPT_RECONNECT是一个 mysql 选项,只能由 Qt sql 驱动程序传递。而且由于驱动程序在连接断开时不会通知任何人,因此QSqlDatabase也无法告诉您。
0赞 Mark 10/30/2023
@chehrlic你是说我在这里跑题了?
0赞 Mark 10/30/2023
我在哪里可以找到“mysql人”?
0赞 chehrlic 10/30/2023
我不是说你错了,你只是责怪错误的人。mysql开发人员决定弃用它。Qt对此无能为力。
0赞 Mark 10/30/2023
@chehrlic 我很抱歉,但我不是在责怪任何人!我只是在问如何在没有此功能的情况下检测并重新连接到数据库。肯定有方法,我只是不知道:)

答: 暂无答案