我正在连续写入一个数据库文件,该文件的 PRAGMAjournal_mode=WAL,PRAGMAjournal_size_limit=0。我的 C++ 程序有两个线程,一个读取器(以 15 秒间隔查询)和一个写入器(以 5 秒间隔插入)。
每 3 分钟,我都会暂停插入,以从编写器线程运行 sqlite3_wal_checkpoint_v2(),模式参数为 SQLITE_CHECKPOINT_RESTART。为了确保此时没有正在进行任何活动的读取操作,我设置了一个即将发生检查点的标志,并在运行检查点之前等待读取器完成(连接仍然打开)。检查点完成后,我再次向读者表明可以恢复查询。
sqlite3_wal_checkpoint_v2()返回SQLITE_OK,并且pnLog和Ckpt相等(大约4000),表明完整的wal文件已与主数据库文件同步。所以接下来的编写应该根据文档从头开始。然而,这似乎并没有发生,因为后续写入会导致 WAL 文件无限增长,最终达到一些 GB。
我做了一些搜索,发现读者可能会因开放事务而导致检查点失败。然而,我使用的唯一读取器是在检查点开始之前结束其事务。还有什么可能阻止 WAL 文件不增长?
| 归档时间: |
|
| 查看次数: |
6978 次 |
| 最近记录: |