Qt5 使用 SQLite (3) – 事务操作提升速度

目录 Content
[hide]

SQLite 的 “事务由3个命令控制:BEGIN、COMMIT和ROLLBACK。BEGIN开始一个事务,之后的所有操作都可以取消。COMMIT使BEGIN后的所有命令得到确认;而ROLLBACK还原BEGIN之后的所有操作。(注1)”,使用事务批量写入SQLite的速度会有质的提高。

构建一段代码,使用控制台程序,创建表之后,向此表连续插入大量数据,用计时器来测量操作所需的时间。程序创建过程本文不表,可参照《Qt5 使用 SQLite (1) – 控制台程序》一文。

测试代码

#include <QCoreApplication>
#include <QtSql>
#include <QDebug>
#include <QTime>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    //
    QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("test.db");
    //
    if(!db.open()){
        qDebug()<<"Could not open file!"<<endl;
        return -1;
    }else{
        qDebug()<<"Open file: "<<db.databaseName()<<" sucessfully!"<<endl;
    }
    //
    //db.transaction();
    //
    QSqlQuery query;
    if(query.exec("create table if not exists product (type TEXT, para1 REAL, para2 REAL, para3 REAL, timestamp NOT NULL DEFAULT  (datetime('now','localtime')))")){
        qDebug()<<"create table: product successfully!"<<endl;
    }else{
        qDebug()<<"could not create table: product!"<<endl;
    }
    //
    QTime time;
    time.start();
    //
    for(int i=0;i!=3000;++i){
        if(!query.exec(" insert into product(type, para1, para2, para3)  values ('SN001', 30.00,10.00, 20.00)")){
            qDebug()<<"could not insert!"<<endl;
            return -1;
        }
    }
    //
    //db.commit();
    qDebug()<<"time is "<<time.elapsed()<<" ms"<<endl;
    //
    db.close();
    //
    return a.exec();
}

测试结果

运行后,结果显示花费 37 秒

qt5-sqlite-transaction-console_1

db.transaction(); 
db.commit();

的注释去掉,重新运行,显示花费时间只有 0.123 秒! 速度提升是如此之大!

qt5-sqlite-transaction-console_2按照插入3000条指令的时间来估算,一秒钟可以插入30000条指令。

源码下载

 

注1:摘自 《 SQLite 权威指南 》

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.