学而实习之 不亦乐乎

Android:SQLite 生成的 -journal、-wal、-shm 文件的作用

2022-07-14 08:26:30

在创建数据库时,不仅会生成xxx.db数据库文件,而且还会生成xxx.db-journal。这个-journal文件是用来干嘛的?其实这个文件是sqlite用来实现原子提交和回滚功能的。如果没有这个文件,SQlite将无法回滚未完成的事务,如果在事务中间发生崩溃或者掉电,那么整个数据库就有可能损坏。

1、-journal 回滚日志

回滚日志通常位于数据库文件所在的目录,一般在事务开始时创建,事务结束时删除(这取决于日志模式)

日志模式:
DELETE:默认的日志模式,一般在事务开始时创建回滚日志,事务结束时删除回滚日志。
PERSIST:事务结束时不删除回滚日志,而是在日志文件头部覆写0,这样也可以达到删除文件同样的效果,却减少了反复创建删除回滚日志的磁盘开销。
MEMORY:将回滚日志存储在内存而不是磁盘中,但因为在磁盘中没有用于恢复的文件,如果在事务中间发生崩溃或者掉电,那么整个数据库就有可能损坏。
OFF:禁用SQLite原子提交和回滚功能。

2、-wal 预写日志

作用与-journal文件一样,用于在WAL模式下操作。

当数据库连接首次打开时,wal文件就会被创建。当最后一次数据库连接被正常关闭时,wal文件就会被删除。如果最后一次数据库连接没有正常关闭,wal文件会保存下来,直到下一次打开数据库时才会自动删除。

3、-shm 共享内存文件

共享内存文件用于提供一块共享内存给多个进程在 WAL 模式中访问相同的数据库。