QSql数据库超出范围后,连接仍处于打开状态
Connection still open after QSqlDatabase goes out of scope
为什么下面的代码打印为真而不是假?
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
对象超出范围时,数据库连接将关闭。因此,当db1
在openDatabase()
结束时超出范围时,应关闭连接。
(实际发生的事情更微妙一些。在内部,QSqlDatabase
维护它为特定连接返回的QSqlDatabase
对象的引用计数。引用计数递减 ~QSqlDatabase
,当它达到 0 时,连接将关闭。但是,这不应该改变任何事情。引用计数应在 openDatabase()
中的第一行之后为 1,在函数结束且 db1 被销毁后应为 0。
我错过了什么?
你是对的,根据 QTBUG-17140,尽管错误中的场景略有不同,但问题是普遍的,因为实现isOpen()
检查数据库连接是否处于活动状态时存在问题,直到 Qt 5.3.1 才报告,错误报告没有显示它已解决。
相关文章:
- OSX蓝牙打开RFCOMMChannelAsync声称已连接,但未建立连接,并且从未调用过委托
- 如何在 2 台主机之间保持 UDP 套接字连接打开
- 串行连接正在打开所有端口?
- 打开与 Qt/C++ 的数据库连接
- QSql数据库超出范围后,连接仍处于打开状态
- 如何保持 HTTP 长轮询连接打开?
- 返回打开的插座连接/留下套接字连接打开C
- 连接四个成功的组合检查适用于大多数情况,但不适用于某些情况
- 要打开以供C++中的应用程序最佳使用的并行套接字/TCP连接数
- 我如何确保Fopen()相对于可执行的目录打开一个文件,而不是我当前的目录
- 我可以在nginx + spawn-fcgi中永远打开MySQL连接吗?
- 使用Winsock API同时打开TCP连接
- 在C++中,相当于CPython字符串连接
- 防火墙异常代码仅适用于传出连接
- Java打开文件,选项类似于Windows c++file_FLAG_WRITE_TROUGH
- 打开PostgreSQL数据库连接的效率
- ODBC 连接未打开
- cups:如何确定当前/默认打印机是否已物理连接并打开
- Boost::asio::acceptor语言 - 在旧连接仍然打开的情况下接受新连接
- Qt:数据库连接无法打开