在 WWDC 2013 会议 '207: What's New in Core Data' 中,他们提到您可以通过在添加持久存储时传递选项字典来启用 SQLite WAL:
@{ NSSQLitePragmasOption: @"journal_mode = WAL" }
(在 iOS4+ 上可用,并将成为未来 iOS 版本的默认设置)。
我想知道在我的应用程序中为早期 iOS 版本启用这通常是否是一件好事。
我已经查阅了关于预写日志记录的 SQLite 页面以及他们提到的缺点,其中大多数似乎不适用于 iOS,除了:
- 在主要进行读取而很少写入的应用程序中,WAL 可能比传统的回滚日志方法慢得多(可能慢 1% 或 2%)。
几乎所有的优势听起来都像是对 iOS 的好处:
- 在大多数情况下,WAL 明显更快。
- WAL 提供了更多的并发性,因为读取器不会阻塞写入器,写入器不会阻塞读取器。读和写可以同时进行。
- 使用 WAL 的磁盘 I/O 操作往往更具顺序性。
- WAL 使用更少的 fsync() 操作,因此在 fsync() 系统调用被破坏的系统上不易受到问题的影响。
我假设(可能需要对我的应用程序进行一些检查以确保它不会减慢速度)这将是一件好事,但是我应该注意什么缺点或任何已知问题?