SQLITE wal文件大小不断增长

时间:2014-12-18 10:08:57

标签: sqlite wal

我正在连续写入一个db文件,其中包含PRAGMA journal_mode = WAL,PRAGMA journal_size_limit = 0。我的C ++程序有两个线程,一个读取器(以15秒的间隔查询)和一个写入器(以5秒的间隔插入)。

我每隔3分钟暂停插入以从编写器线程运行sqlite3_wal_checkpoint_v2(),并将mode参数作为SQLITE_CHECKPOINT_RESTART。为了确保此时没有进行有效的读取操作,我设置了一个标记,即检查点即将发生并等待读取器完成(连接仍然打开),然后再运行检查点。检查点完成后,我再次向读者表明可以继续查询。

sqlite3_wal_checkpoint_v2()返回SQLITE_OK,pnLog和Ckpt相等(大约4000),表示完整的wal文件已与主db文件同步。因此,下一篇文章应该从文档开始。但是,这似乎并没有发生,因为随后的写入导致WAL文件无限增长,最终达到一些GB。

我做了一些搜索,发现读者可能因打开交易而导致检查点失败。但是,我使用的唯一读者是在检查点启动之前结束其事务。还有什么可以阻止WAL文件不增长?

1 个答案:

答案 0 :(得分:1)

作为答案,这已经太晚了,但可能对其他人有用。

根据SQLite documentation,您的期望应该是正确的,但如果您阅读此SO post,则在未定稿的情况下也会出现问题。因此,如果您只是sqlite3_reset()您的语句,那么无论如何,db都可能看起来已锁定来检查点。请注意,SQLITE_CHECKPOINT_values的更高级别也可能会发生这种情况。

此外,SQLITE_CHECKPOINT_TRUNCATE值(如果成功运行checkout)会将-wal文件截断为零长度。这可以帮助您检查所有页面是否已插入数据库。

-wal由于语句未完成而var isOnTop = true; $(window).scroll(function(){ var isCurrentOnTop = $(window).scrollTop()===0; if(isOnTop == isCurrentOnTop) //scroll has changed but we only care when has changed from or to 0 return; isOnTop = isCurrentOnTop; var effect = isOnTop? "fadeIn": "fadeOut"; $("#topbottom").velocity("finish").velocity(effect, { delay: 500, duration: 1500 }); }); 个文件变得越来越大的另一个讨论是this

相关问题