Qt中提高sqlite的讀寫速度(使用事務一次性寫入100萬條數據)


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM