SQLite数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行query.exec("insert into DataBase(......) values(......)");就会打开和关闭文件100万次,所以速度当然会很慢。SQLite数据库是支持事务操作的,于是我们就可以通过事务来提高数据库的读写速度。事务的基本原理是:数据库管理系统首先会把要执行的sql语句存储到内存当中,只有当commit()的时候才一次性全部执行所有内存中的数据库。下面是一个简单的QT sqlite数据库事务的例子:

#include <QtCore/QCoreApplication>
#include <QtSql>
#include <iostream>

using namespace std;

int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);

QSqlDatabase    db_sqlite = QSqlDatabase::addDatabase("QSQLITE", "connSQLite");
db_sqlite.setDatabaseName("SQLiteDB.db3");
db_sqlite.open();

QSqlQuery   query("", db_sqlite);
bool    bsuccess = false;
QTime    tmpTime;

// 开始启动事务
db_sqlite.transaction();
tmpTime.start();
for(int i = 0; i<100000; i++)
{
   bsuccess = query.exec("insert into DataBase(D_1,D_2,D_3,D_4,D_5) values('TT','TT','TT','TT','TT')");
   if (!bsuccess)
   {
    cout<<"Error occur"<<endl;
    break;
   }
  
}

// 提交事务,这个时候才是真正打开文件执行SQL语句的时候
db_sqlite.commit(); 
cout<<"10000条数据耗时:"<<tmpTime.elapsed()<<"ms"<<endl;

}

其实QT 操作sqlite数据库增加事务的功能就是上面例子中蓝色字体标出的两句话,如果去掉这两句话,程序又会还原为:打开文件——执行 query.exec(...)——关闭文件。大家可以试一下,添加这两句即增加事务以后数据插入的速度明显提高很多。

在入库和更新过程中按照数据库事务的思想进行设计:SQLite执行入库、更新操作的方式是,sql语句执行对象句柄调用库函数打开文件、调用函数执行sql语句、关闭文件。这样的执行方式对于数量级别超大的文件的弊端就是每次执行sql语句的时候都要打开文件(假设百万级数量级的数据,就要打开和关闭文件百万次),对于数据库的入库和更新操作时间主要都浪费到了文件的打开和关闭操作上,所以这里增加事务以解决该问题。

http://cdn.verydemo.com/demo_c278_i9327.html

最新文章

  1. Spring.Net 初探之牛刀小试
  2. JMS与MQ详解(有项目)
  3. JS-结合html综合练习js的对象——班级成绩表制作
  4. java语法体系
  5. esriSRProjCS4Type Constants
  6. oracle11g 数据文件误删恢复(无备份)
  7. UVA 10652 Board Wrapping(凸包)
  8. c# 哈希表集合;函数
  9. 深入了解java同步、锁紧机构
  10. 沃森Mysql数据库修复工具
  11. Spring Security(19)——对Acl的支持
  12. Django项目搭建和配置总结
  13. 563. Binary Tree Tilt
  14. 前端性能优化 —— 减少HTTP请求
  15. TCP/IP协议(6):传输层之UDP
  16. python -- 解决If using all scalar values, you must pass an index问题
  17. python+Django框架运用(四)
  18. flask-migrate库的使用
  19. 掌握Sed命令
  20. .net core Web应用启动类

热门文章

  1. 基于visual Studio2013解决C语言竞赛题之0708字符串查找
  2. ios开发问题:添加库和复制其它工程文件编译错误问题
  3. hdu4620 Fruit Ninja Extreme
  4. mysql 初识之日志文件篇
  5. NEC协议
  6. VS2010对C++11的支持列表(感觉大部分都不支持)
  7. 基于visual Studio2013解决C语言竞赛题之1026判断排序
  8. C# 未能加载文件或程序集“MySQLDriverCS...&quot; 错误解决
  9. Bitmap Style Designer非官方说明
  10. android源码地址及下载介绍