使用SQLite存储数据时发现插入速度太慢,程序跑了将近五分钟才插入了不到三千条。上网查资料才发现,SQLite这种文件数据库与MySql机制不一样,每条事务都有打开和关闭文件的步骤,SQLite默认将每条语句看成单独的事务。当我逐条插入数据时,就会出现大量的文件IO操作,效率自然不高。需要将多个插入操作放到一个事务中,就可以显著提升插入效率。

QT中使用事务的方法如下:

QSqlDatabase app_database;
// 设置数据库参数
// ...
app_database.transaction(); // 开始一个事务
// 执行SQL操作
// ...
app_database.commit(); // 提交

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

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

http://windrocblog.sinaapp.com/?p=835

Qt SQLite 批量插入优化(SQLite默认将每条语句看成单独的事务)good的更多相关文章

  1. SQLite批量插入优化方法

    SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度.   例如:向数据库中插入10 ...

  2. 【MySQL】insert批量插入优化方案

    对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长.特别像报表系统,每天花费在数据导入上的时间可能会长达几个小时或十几个小时之久.因此,优化数据库插入性能是很有意义的. ...

  3. android sqlite批量插入数据速度解决方案

    转自 http://hi.baidu.com/hfutonline/blog/item/62b1e4de8bdf4b2e5882dd28.html 最近在做android项目的时候遇到一个问题,应用程 ...

  4. android SQLite 批量插入数据慢的解决方案 (针对于不同的android api 版本)

    原地址 :http://www.cnblogs.com/wangmars/p/3914090.html SQLite,是一款轻型的数据库,被广泛的运用到很多嵌入式的产品中,因为占用的资源非常少,二其中 ...

  5. MSSQL数据批量插入优化详细

    序言 现在有一个需求是将10w条数据插入到MSSQL数据库中,表结构如下,你会怎么做,你感觉插入10W条数据插入到MSSQL如下的表中需要多久呢? 或者你的批量数据是如何插入的呢?我今天就此问题做个探 ...

  6. JDBC批量插入优化addbatch

    // 获取要设置的Arp基准的List后,插入Arp基准表中 public boolean insertArpStandardList(List<ArpTable> list) { Con ...

  7. oracle批量插入优化方案

    今天听DBA说如果从一个表批量查询出一批数据之后批量插入另外一张表的优化方案: 1)不写归档日志: 2)采用独占 关于insert /*+ append */我们需要注意以下三点: a.非归档模式下, ...

  8. JPA批量插入优化

    遇到一个需求是excel数据导入,一次大概会批量插入几万的数据.写完一测奇慢无比. 于是开始打日志,分析代码,发现是插入数据库的时候耗时很长,发现是spring data jpa的原因. 翻看jpa的 ...

  9. Android Sqlite 批量插入性能优化

    db.beginTransaction(); try { for (...) { db.execSQL("...", new Object[]{}); } db.setTransa ...

随机推荐

  1. c# 读/写文件(各种格式)

    最简单的: --------写 //content是要写入文本的字符串 //(@txtPath + @"\" + rid + ".txt");要被写入的TXT ...

  2. thinkphp3.1的验证码

    代码中写 public function verify(){ import('ORG.Util.Image'); ob_clean(); Image::buildImageVerify(); } ht ...

  3. Django日志器的使用

    Logging Mudel A quick logging primer Django uses Python’s builtin logging module to perform system l ...

  4. 在Eclipse上打包并使用Proguard工具混淆jar包

    近期由于工作须要,学习到了Android jar包的打包与混淆. 之前觉得还是非常easy的,可是自己深入研究下,发现还是有一些东西须要注意的,并且自己也踩了一些坑,在这里写下供同僚们借鉴借鉴. 转载 ...

  5. Spring MVC--@RequestMapping

    2.1 @RequestMapping @RequestMapping是SpringMVC的核心注解,负责访问的url与调用方法之间的映射; @RequestMapping可以放在类和方法上; @Re ...

  6. Android 实现Xmpp工具类

    /** * XMPP服务器连接工具类. * * @author chen.lin * */ public class XmppManager { private static final String ...

  7. Spring MVC出现POST 400 Bad Request &405 Request method 'GET' not supported

    首先描述一下出现错误的情景: 我刚学springmvc,想做一个登录界面的东西.然后试着写了一个controller如下: @RequestMapping(value = "/login&q ...

  8. 笔记-Windows10家庭中文版系统下使用Docker

    1.docker是使用Linux内核的,在windows系统下需要使用虚拟机来运行docker. 2.Windows版的docker安装要求,(1)64为操作系统,win7或者更高,(2)支持&quo ...

  9. hbase 2.0.2 增删改查

    package cn.hbase.demo; import java.io.IOException; import java.util.Iterator; import org.apache.hado ...

  10. Java一些基本帮助类

    Scanner sc=new Scanner(System.in); sc.nextInt(); sc.next(); Random ran=new Random(); ran.nextInt(); ...