Android 9 引入了一种名为“兼容性预写式日志 (WAL)”的特殊 SQLiteDatabase 模式,该模式允许数据库使用 journal_mode=WAL
,同时保留每个数据库最多保留一个连接的行为。
默认情况下,应用的数据库会启用兼容性 WAL,除非应用具有以下任一情况:
- 通过调用
SQLiteDatabase.enableWriteAheadLogging
或disableWriteAheadLogging
,选择启用或停用预写式日志 - 通过调用
SQLiteDatabase.OpenParams.setJournalMode(String mode)
显式请求日志模式
启用 WAL 日志模式可以显著提高性能并减少写入量。例如,在 ext4 文件系统上,WAL 可以使写入速度提高 4 倍。
默认情况下启用兼容性 WAL,并且不需要任何额外的实现。
停用兼容性 WAL
要停用兼容性 WAL 模式,请叠加 db_compatibility_wal_supported
配置资源。
例如
<bool name="db_compatibility_wal_supported">false</bool>
您可能希望为 WAL 日志模式不提供优于传统回滚日志模式的性能优势的配置停用兼容性 WAL。例如,在 F2FS 文件系统上,尽管 SQLite 支持原子写入,并且 DELETE 日志性能与 WAL 相似,但 WAL 可能会使写入量增加 10% 到 15%。
验证
要验证兼容性 WAL 模式,请从 CtsDatabaseTestCases 模块运行 CTS 测试。CTS 测试将验证启用兼容性 WAL 时的预期行为。