数据中心有多种日志模式,具体描述如下,本次主要分析WAL日志模式的配置和操作:
#define DB_JOURNAL_DELETE "DELETE" //默认模式。在该模式下,在事务结束时,日志文件将被删除
#define DB_JOURNAL_TRUNCATE "TRUNCATE" //日志文件被阶段为零字节长度
#define DB_JOURNAL_PERSIST "PERSIST" //日志文件被留在原地,但头部被重写,表明日志不再有效
#define DB_JOURNAL_MEMORY "MEMORY" //日志记录保留在内存中,而不是磁盘上
#define DB_JOURNAL_OFF "OFF" //不保留任何日志记录
#define DB_JOURNAL_WAL "WAL" //数据库预写日志
1. 配置WAL日志模式(整个SQLite句柄只有一次日志模式配置,经实测,只有第一次有效,后面再修改时已无效):
sqlite3_exec(pHandle, "PRAGMA journal_mode = WAL", NULL, 0, &err))
2. 配置WAL日志自动提交(数据库wal文件记录页到设置的个数,wal文件数据将同步到本地文件)
sqlite3_exec(pHandle, "PRAGMA wal_autocheckpoint=1000", NULL, 0, &err))
3. 手动触发WAL日志提交
...
4. 关闭WAL
sqlite3_exec(db, "PRAGMA journal_mode=DELETE;", NULL, 0, &zErrMsg);
风险:wal、shm缓冲区都是基于文件,并非内存,这对嵌入式NandFash的读写次数有影响
具体分析参考:https://www.jianshu.com/p/6a3cb84e8e9a