Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1505|回复: 0
打印 上一主题 下一主题

Qt SQLite 批量插入优化

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2016-7-7 10:10:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 hechengjin 于 2016-7-27 10:07 编辑

使用SQLite存储数据时发现插入速度太慢,程序跑了将近五分钟才插入了不到三千条。上网查资料才发现,SQLite这种文件数据库与MySql机制不一样,每条事务都有打开和关闭文件的步骤,SQLite默认将每条语句看成单独的事务。当我逐条插入数据时,就会出现大量的文件IO操作,效率自然不高。需要将多个插入操作放到一个事务中,就可以显著提升插入效率。
QT中使用事务的方法如下:
  1. QSqlDatabase app_database;
  2. // 设置数据库参数
  3. // ...
  4. app_database.transaction(); // 开始一个事务
  5. // 执行SQL操作
  6. // ...
  7. app_database.commit(); // 提交
复制代码

但项目中需要获取插入后自动生成的id。逐条插入时,可以用QSqlQuery::lastInsertId()方法获取,但使用事务进行批量插入后,就无法用lastInsertId(),因为我们需要获取插入数据的ID集。为了将ID赋给对象,还需要确保与对象的一一对应关系。

因为项目中父对象包含多个子对象,保存在QVector容器中,所以我利用QVector的有序性来保证对象的对应关系。将子对象在QVector中的下标index保存在数据库中,批量插入子对象后,将所有子对象的id和index一同取出,根据index设置相应对象的id。这样,就可以用事务批量插入子对象,再填充子对象的ID。


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-4-28 18:47 , Processed in 0.055713 second(s), 18 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表