QSqlDatabase 数据库操作没有removeDatabase 导致程序崩溃(此文极有可能是错误的,仅作个人留档参考)

本文探讨了QSqlDatabase在使用后未正确移除导致的资源泄漏问题,指出在存在活跃查询时调用removeDatabase将引发警告。正确的做法是确保查询结束后数据库连接超出作用域自动关闭,然后安全地移除数据库连接。调试中遇到的问题是尝试关闭已使用的'qt_sql_default_connection'导致的崩溃。

在使用Qt的QSqlDatabase进行异步操时,如果处理不当,可能会遇到一些问题,比如可能导致程序挂起或崩溃。这是因为QSqlDatabase默认是非阻塞的,如果直接在主线程中执行数据库查询,当查询耗时过长时,程序会暂停其他任务直到查询完成,这就会造成程序假死。为了避免这种情况,推荐采取以下策略: 1. **使用信号槽机制**:通过注册信号(如QSqlQuery::finished)并连接相应的槽函数,在后台线程中执行查询,然后在槽函数中更新UI或者其他逻辑。 ```cpp connect(db, &QSqlDatabase::queryFinished, this, [db](bool success) { if (success) processResults(); }); ``` 2. **使用QThread**:将数据库操作放入单独的线程,确保主界面不会因数据库操作而卡顿。 ```cpp QThread* dbThread = new QThread; QSqlDatabase* sqlDb = new QSqlDatabase(this); sqlDb->moveToThread(dbThread); // 等待线程启动成功 if (!dbThread->start()) { // 错误处理 } // 发送查询请求 sqlDb->exec(queryString); // 线程结束时清理资源 connect(sqlDb, &QSqlDatabase::closed, dbThread, &QThread::quit); connect(dbThread, &QThread::finished, sqlDb, &QSqlDatabase::deleteLater); connect(dbThread, &QThread::finished, dbThread, &QThread::deleteLater); ``` 3. **使用Qt的Future和Promise**:Qt5.9及以上版本引入了Concurrent框架,可以更好地管理异步操,避免回调地狱。 ```cpp QFuture<void> future = db->execAsync(queryString); future.waitForFinished(); // 如果需要等待结果 ``` 总之,为了防止程序挂起或崩溃,应当尽量在独立的线程或异步上下文中执行数据库操作,并妥善处理结果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值