回覆列表
  • 1 # 大國師魂系列

    Sqlite 快取引數在下文中查詢:資料庫一般執行在嵌入式環境中,需要兼顧效能和硬體資源。

    SQLite 使用 PRAGMA 命令在 SQLite 環境內控制各種環境變數和狀態標誌。一個 PRAGMA 值可以被讀取,也可以根據需求進行設定。主要介紹幾個在嵌入式開發中經常使用的關鍵引數。

    synchronous

    synchronous Pragma 獲取或設定當前磁碟的同步模式,該模式控制積極的 SQLite 如何將資料寫入物理儲存。也就是說該引數控制何時執行sync指令。

    Pragma 值描述0 或 OFF不進行同步。1 或 NORMAL在關鍵的磁碟操作的每個序列後同步。2 或 FULL在每個關鍵的磁碟操作後同步。

    當synchronous設定為FULL (2), SQLite資料庫引擎在緊急時刻會暫停以確定資料已經寫入磁碟。這使系統崩潰或電源出問題時能確保資料庫在重起後不會損壞。為了保證資料的安全性,該項建議設定為FULL。

    journal_mode

    journal_mode Pragma 獲取或設定控制日誌檔案如何儲存和處理的日誌模式。

    Pragma 值描述DELETE預設模式。在該模式下,在事務結束時,日誌檔案將被刪除。TRUNCATE日誌檔案被階段為零位元組長度。PERSIST日誌檔案被留在原地,但頭部被重寫,表明日誌不再有效。MEMORY日誌記錄保留在記憶體中,而不是磁碟上。OFF不保留任何日誌記錄。

    首先補充一個知識點,SQLite中日誌模式主要有DELETE和WAL兩種,其中WAL(Write ahead logging)是一種日誌模式,它是一種思想,普遍應用於關係型資料庫。每個事務執行變更時,修改資料頁,同時會產生日誌,這樣在事務提交後,不需要將修改的髒頁刷盤,只需要將事務產生的日誌落盤即可返回。WAL保證日誌一定先於對應的髒頁落盤,就是所謂的WAL。

    DELETE模式採用影子分頁技術(Shadow paging),DELETE模式下,日誌中記錄的變更前資料頁內容;WAL模式下,日誌中記錄的是變更後的資料頁內容。事務提交時,DELETE模式將日誌刷盤,將DB檔案刷盤,成功後,再將日誌檔案清理;WAL模式則是將日誌檔案刷盤,即可完成提交過程。

    建議將journal_mode 設定為delete,當資料寫入資料庫有失敗動作時,透過journal檔案予以復原到未更動前(原始)資料,來確保資料完整與一致性。如果在每次寫入的時間很長或頻繁的進行資料庫寫入情況下,因系統(主機)電力不穩或突然斷電時,那麼下次重新啟動,而journal檔案若存在,則在開啟SQLite資料庫時,若發現有journal檔案的存在,便會對資料庫做Rollback 動作(還原)。

    journal_size_limit

    預設值為-1,表示沒有限制,單位是位元組。

    DELETE模式下,當日志增長超過閥值時,則進行截斷。default_journal_size_limit,用於設定日誌檔案的預設大小。

    cache_size

    cache_size Pragma 可獲取或暫時設定在記憶體中頁面快取的最大尺寸。

    pages 值表示在快取中的頁面數。內建頁面快取的預設大小為 2,000 頁,最小尺寸為 10 頁。每頁使用約1.5K記憶體,若需要使用改變大量多行的UPDATE或DELETE命令,並且不介意SQLite使用更多的記憶體的話,可以增大快取以提高效能。建議設定為2000即可。

    auto_vacuum

    auto_vacuum Pragma 獲取或設定 auto-vacuum 模式。

    Pragma 值描述0 或 NONE禁用 Auto-vacuum。這是預設模式,意味著資料庫檔案尺寸大小不會縮小,除非手動使用 VACUUM 命令。1 或 FULL啟用 Auto-vacuum,是全自動的。在該模式下,允許資料庫檔案隨著資料從資料庫移除而縮小。2 或 INCREMENTAL啟用 Auto-vacuum,但是必須手動啟用。在該模式下,引用資料被維持,自由頁面只放在自由列表中。這些頁面可在任何時候使用 incremental_vacuum pragma 進行覆蓋。

    正常情況下,當提交一個從資料庫中刪除資料的事務時,資料庫檔案不改變大小。未使用的檔案頁被標記並在以後的新增操作中再次使用。這種情況下使用VACUUM命令釋放刪除得到的空間。但是Vacuum的效率非常低!建議 設定成NONE(0),定時手動進行VACUUM操作。

    void db_config(sqlite3 *db)

    {

    int ret;

    char *errmsg=NULL;

    system("sync");

    ret = db_sql_exec(db,"pragma journal_mode=delete;",&errmsg);

    if(ret !=SQLITE_OK)

    {

    fprintf(stderr, "config db wal error: %s\n", errmsg);

    sqlite3_free(errmsg);

    }

    ret = db_sql_exec(db,"pragma synchronous=FULL;",&errmsg);

    if(ret !=SQLITE_OK)

    {

    fprintf(stderr, "config db synchronous error: %s\n", errmsg);

    sqlite3_free(errmsg);

    }

    ret = db_sql_exec(db,"pragma journal_size_limit=409600;",&errmsg);

    if(ret !=SQLITE_OK)

    {

    fprintf(stderr, "config db journal_size_limit error: %s\n", errmsg);

    sqlite3_free(errmsg);

    }

    ret = db_sql_exec(db,"PRAGMA cache_size =2000",&errmsg);

    if(ret !=SQLITE_OK)

    {

    fprintf(stderr, "config db cache_size error: %s\n", errmsg);

    sqlite3_free(errmsg);

    }

    ret = db_sql_exec(db,"PRAGMA auto_vacuum = NONE;",&errmsg);

    if(ret !=SQLITE_OK)

    {

    fprintf(stderr, "config db auto_vacuum error: %s\n", errmsg);

    sqlite3_free(errmsg);

    }

    }

    參考:

    https://blog.csdn.net/tietao/article/details/6890350

    https://www.runoob.com/sqlite/sqlite-pragma.html

    http://www.it165.net/database/html/201310/4691.html

    https://blog.csdn.net/zhaofuguang/article/details/91882073

  • 中秋節和大豐收的關聯?
  • 有適合學生用的平價去痘洗面奶推薦嗎?