Android 9 開始採用之 SQLite WAL 模式

前言

從 Android 9 開始,App 的 SQLite 日誌模式預設採用 SQLite 在 3.7.0 版加入的 WAL (Write-Ahead Logging) 模式。
相較於原本的 TRUNCATE 模式,有寫入速度較快、讀和寫不會阻塞......等優點。
詳細內容可以參考 SQLite 官方網站,這邊就不詳述了。
Write-Ahead Logging

採用 WAL 前後的檔案結構差異

原先的 databases 目錄下有 *.db 和 *.db-journal 兩個檔案。



採用 WAL 的 databases 目錄下則改為 *.db、*.db-shm、*.db-wal 三個檔案。


交易模型 (Transaction Model)

日誌 (journal) 的主要目的是為了要讓 SQLite 可以支援「交易」(TRANSACTION),當交易失敗或中斷時可用此檔案來還原。

而 SQLite 對於日誌的處理有兩種作法:

回滾日誌檔 (Rollback Journal):

先將原內容則備份至 Rollback Journal 中,再將要異動的內容直接寫入 DB。當需要 rollback 時,再將原內容由日誌檔寫回 DB;若要 commit 變更時,則只要將該檔案刪除即可。
而 rollback 的日誌模式又可細分為 4 種:DELETE (SQLite 預設值)、TRUNCATE (Android 版 SQLite 預設值)、PERSIST、MEMORY

WAL (Write-Ahead Log): 

作法與 Rollback Journal 剛好相反。原內容仍保留在原 DB 之中,但新的異動則 append 至 WAL 檔。而當 COMMIT 發生時,僅代表某筆記錄已 append 進 WAL 檔了,但並不一定有寫入原 DB (當 WAL 檔案大小到達 checkpoint 的閥值時才會寫入)。如此可讓其他資料庫連結繼續對原 DB 內容進行讀取操作,而其他連結也可同時將異動 COMMIT 進 WAL 檔。

啟用/停用 WAL

在繼承 SQLiteOpenHelper 的 class 中覆寫 onConfigure 方法,加入一行指令就行!


參考資料

https://source.android.com/devices/tech/perf/compatibility-wal
https://www.sqlite.org/wal.html

留言

這個網誌中的熱門文章

Android 藍牙連接通訊實作心得

在 Android 上自訂 Zxing 掃描框樣式與大小位置