QSql数据库超出范围后,连接仍处于打开状态

Connection still open after QSqlDatabase goes out of scope

本文关键字:连接 于打开 状态 数据库 范围 QSql      更新时间:2023-10-16

为什么下面的代码打印为真而不是假?

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    if (!openDatabase()) return 1;
    // false means don't open closed connections.
    QSqlDatabase db2 = QSqlDatabase::database("foo", false);
    qDebug() << db2.isOpen();
    return 0;
}
bool openDatabase()
{
    QSqlDatabase db1 = QSqlDatabase::addDatabase("QPSQL", "foo");
    db1.setHostName("localhost");
    db1.setUserName("user");
    db1.setPassword("password");
    db1.setDatabaseName("bar");
    return db1.open();
}

根据 QSqlDatabase 和 QSqlQuery 的正确方法是什么?的第一个答案中的示例 #2,当QSqlDatabase对象超出范围时,数据库连接将关闭。因此,当db1openDatabase()结束时超出范围时,应关闭连接。

(实际发生的事情更微妙一些。在内部,QSqlDatabase维护它为特定连接返回的QSqlDatabase对象的引用计数。引用计数递减 ~QSqlDatabase,当它达到 0 时,连接将关闭。但是,这不应该改变任何事情。引用计数应在 openDatabase() 中的第一行之后为 1,在函数结束且 db1 被销毁后应为 0。

我错过了什么?

你是对的,根据 QTBUG-17140,尽管错误中的场景略有不同,但问题是普遍的,因为实现isOpen()检查数据库连接是否处于活动状态时存在问题,直到 Qt 5.3.1 才报告,错误报告没有显示它已解决。