首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQLite: journal_mode = wal和同步=法线的同步

SQLite: journal_mode = wal和同步=法线的同步
EN

Stack Overflow用户
提问于 2015-03-17 15:40:19
回答 1查看 732关注 0票数 2

我在Debian 7上使用SQLite 3.7.13有一个有趣的问题。

我使用SQLite与"PRAGMA journal_mode = wal“和"PRAGMA同步= normal”一起尝试避免在Python程序的主事件循环中使用fsyncs。如文档所示,我禁用了自动检查点,并定期在不同线程中运行"PRAGMA “,以便将最新的数据同步到磁盘。

但是,我发现第一次插入操作是在主程序线程中的检查点之后执行的,这会导致对WAL文件本身进行一次性的fsync调用。任何进一步的插入操作都不会导致fsync。我已经用strace验证了这一点。

看一下SQLite文档,它说:

当在检查点之后开始重用WAL文件时,将同步WAL文件头。

我正在寻找一种方法来防止在主线程中发生任何fsyncs,但这仍然允许我从另一个线程执行周期性的检查点。在检查点线程中是否还有更多的操作可以避免主线程中的fsync?

我看过“同步= off",但是这也阻止了检查点的fsyncs。

注意:我对两个线程中的每个线程都有一个单独的数据库连接(如果相关的话)。

进一步注意:文档似乎在其他地方说不应该有fsync,但是观察到的行为显然不同:

注意,当PRAGMA同步设置为正常时,检查点是唯一发出I/O屏障或同步操作( unix上的fsync()或windows上的FlushFileBuffers() )的操作。因此,如果应用程序在单独的线程或进程中运行检查点,则执行数据库查询和更新的主线程或进程永远不会阻止同步操作。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-03-17 16:10:02

若要将fsync移动到另一个线程,请执行更改该线程中数据库的第一个操作。您可以使用一些无害的东西,比如PRAGMA user_version = 42 (假设您不使用用户版本)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29103429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档