qt中的mysql能存入多少行数据_Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)...
SQLite數(shù)據(jù)庫本質上來講就是一個磁盤上的文件,所以一切的數(shù)據(jù)庫操作其實都會轉化為對文件的操作,而頻繁的文件操作將會是一個很好時的過程,會極大地影響數(shù)據(jù)庫存取的速度。例如:向數(shù)據(jù)庫中插入100萬條數(shù)據(jù),在默認的情況下如果僅僅是執(zhí)行query.exec("insert into DataBase(......) values(......)");就會打開和關閉文件100萬次,所以速度當然會很慢。SQLite數(shù)據(jù)庫是支持事務操作的,于是我們就可以通過事務來提高數(shù)據(jù)庫的讀寫速度。事務的基本原理是:數(shù)據(jù)庫管理系統(tǒng)首先會把要執(zhí)行的sql語句存儲到內存當中,只有當commit()的時候才一次性全部執(zhí)行所有內存中的數(shù)據(jù)庫。下面是一個簡單的QT sqlite數(shù)據(jù)庫事務的例子:
#include
#include
#include
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;
}
}
// 提交事務,這個時候才是真正打開文件執(zhí)行SQL語句的時候
db_sqlite.commit();
cout<
}
其實QT 操作sqlite數(shù)據(jù)庫增加事務的功能就是上面例子中藍色字體標出的兩句話,如果去掉這兩句話,程序又會還原為:打開文件——執(zhí)行 query.exec(...)——關閉文件。大家可以試一下,添加這兩句即增加事務以后數(shù)據(jù)插入的速度明顯提高很多。
在入庫和更新過程中按照數(shù)據(jù)庫事務的思想進行設計:SQLite執(zhí)行入庫、更新操作的方式是,sql語句執(zhí)行對象句柄調用庫函數(shù)打開文件、調用函數(shù)執(zhí)行sql語句、關閉文件。這樣的執(zhí)行方式對于數(shù)量級別超大的文件的弊端就是每次執(zhí)行sql語句的時候都要打開文件(假設百萬級數(shù)量級的數(shù)據(jù),就要打開和關閉文件百萬次),對于數(shù)據(jù)庫的入庫和更新操作時間主要都浪費到了文件的打開和關閉操作上,所以這里增加事務以解決該問題。
http://cdn.verydemo.com/demo_c278_i9327.html
總結
以上是生活随笔為你收集整理的qt中的mysql能存入多少行数据_Qt中提高sqlite的读写速度(使用事务一次性写入100万条数据)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 去掉边框_安卓也有堪比 VOUN 的加边
- 下一篇: oracle常见单词_Oracle中常见