Qt SQLite 批量插入最佳化(SQLite預設將每條語句看成單獨的事務)good

來源:互聯網
上載者:User

標籤:對象   cto   有序性   資料庫   mysql   插入資料   sqli   最佳化   log   

使用SQLite儲存資料時發現插入速度太慢,程式跑了將近五分鐘才插入了不到三千條。上網查資料才發現,SQLite這種檔案資料庫與MySql機制不一樣,每條事務都有開啟和關閉檔案的步驟,SQLite預設將每條語句看成單獨的事務。當我逐條插入資料時,就會出現大量的檔案IO操作,效率自然不高。需要將多個插入操作放到一個事務中,就可以顯著提升插入效率。

QT中使用事務的方法如下:

QSqlDatabase app_database;
// 設定資料庫參數
// ...
app_database.transaction(); // 開始一個事務
// 執行SQL操作
// ...
app_database.commit(); // 提交

但項目中需要擷取插入後自動產生的id。逐條插入時,可以用QSqlQuery::lastInsertId()方法擷取,但使用事務進行批量插入後,就無法用lastInsertId(),因為我們需要擷取插入資料的ID集。為了將ID賦給對象,還需要確保與對象的一一對應關係。

因為項目中父物件包含多個子物件,儲存在QVector容器中,所以我利用QVector的有序性來保證對象的對應關係。將子物件在QVector中的下標index儲存在資料庫中,批量插入子物件後,將所有子物件的id和index一同取出,根據index設定相應對象的id。這樣,就可以用事務批量插入子物件,再填充子物件的ID。

http://windrocblog.sinaapp.com/?p=835

Qt SQLite 批量插入最佳化(SQLite預設將每條語句看成單獨的事務)good

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.