我正在连续写入一个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文件不增长?
答案 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。