QT進階之路 :Qt中提高sqlite的讀寫速度

轉自:https://www.cnblogs.com/findumars/p/5308857.html

(使用事務一次性寫入100萬條數據)實測可用:

SQLite數據庫本質上來講就是一個磁盤上的文件,所以一切的數據庫操作其實都會轉化為對文件的操作,而頻繁的文件操作將會是一個很好時的過程,會極大地影響數據庫存取的速度。例如:向數據庫中插入100萬條數據,在默認的情況下如果僅僅是執行query.exec("insert into DataBase(......) values(......)");就會打開和關閉文件100萬次,所以速度當然會很慢。SQLite數據庫是支持事務操作的,於是我們就可以通過事務來提高數據庫的讀寫速度。事務的基本原理是:數據庫管理系統首先會把要執行的sql語句存儲到內存當中,只有當commit()的時候才一次性全部執行所有內存中的數據庫。下面是一個簡單的QT sqlite數據庫事務的例子:

 #include <qtcore>
#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< break;
}


}
// 提交事務,這個時候才是真正打開文件執行SQL語句的時候
db_sqlite.commit();
cout<}
/<iostream>/<qtsql>/<qtcore>

其實QT 操作sqlite數據庫增加事務的功能就是上面例子中藍色字體標出的兩句話,如果去掉這兩句話,程序又會還原為:打開文件——執行 query.exec(...)——關閉文件。大家可以試一下,添加這兩句即增加事務以後數據插入的速度明顯提高很多。

在入庫和更新過程中按照數據庫事務的思想進行設計:SQLite執行入庫、更新操作的方式是,sql語句執行對象句柄調用庫函數打開文件、調用函數執行sql語句、關閉文件。這樣的執行方式對於數量級別超大的文件的弊端就是每次執行sql語句的時候都要打開文件(假設百萬級數量級的數據,就要打開和關閉文件百萬次),對於數據庫的入庫和更新操作時間主要都浪費到了文件的打開和關閉操作上,所以這裡增加事務以解決該問題。


分享到:


相關文章: