QSqlQuery内存问题分析及解决
QSqlQuery内存问题分析及解决
QSqlQuery内存问题分析及解决(QT技巧系列18)
QSqlQuery :: exec()使用一些KB的RAM来执行给定的查询,但在超出作用域后不释放内存。
QSqlDatabase :: open()& close()不会像文档提示那样帮助释放资源。如果有的话,close()会导致资源(至少是内存)在堆/栈上保持“被困”。
解决方法:
1、创建QSqlQuery变量作为指针
要释放这个内存,创建QSqlQuery变量作为指针,并在关闭数据库之前删除此指针:
QStringList values;
db.open();
QString strQuery = "SELECT DISTINCT " + field + " FROM " + table + str;
QSqlQuery *query = new QSqlQuery(db);
query->prepare(strQuery);
if(query->exec() == true)
{
while(query->next())
{
values.push_back(query->value(0).toString());
}
}
delete query;
db.close();
然后在数据库关闭后释放内存。
2、在关闭数据库之前,必须使用QSqlQuery.finish()或QSqlQuery.clear。
在关闭数据库之前,必须使用QSqlQuery.finish()或QSqlQuery.clear。否则,Query对象中会遗漏剩余内存。文档中提到Query对象可用于多个查询。当您查询10,000条记录时,您会注意到“内存泄漏”。内存使用率急剧上升。
query.clear();
query.finish();
db.close();
3、线程中使用的QSqlQuery需要提升为类成员
H头文件中定义:
QSqlQuery queryWarning;
CPP文件中按如下始化化:
queryWarning = QSqlQuery(Qrydb);
执行完毕后
queryWarning.clear();
queryWarning.finish();
db.close();
这样可避免程序多线程向数据库插入数据时偶尔产生崩溃的问题。
备注:实战示例,解疑答惑。
--不间端地思考,实时地批判你的工作!
- 老鼠走迷宫I
- 【Delphi学习】Form的borderstyle属性
- springboot项目搭建0051
- module 与 component 的区别
- Linux下重启mysql的正确方法
- 服务器iis短文件名漏洞,IIS短文件名漏洞分析及一个实例
- Azure App object和Service Principal
- 02195511
- php开源cms系统比较好,最受欢迎免费开源CMS建站系统排行榜
- 高通Linux Android 平台中的蓝牙功能学习 (4)
- vss使用说明!!
- JAVA关于Calendar类的使用
- c函数itoa和atoi实现
- 网页弹出对话框的几种代码
- Shiro系统权限管理、及原理剖析
- 统计学,机器学习,深度学习,数据挖掘的联系
- Qt SQL:QSqlField、QSqlRecord、QSqlIndex、QSqlError