我在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() )的操作。因此,如果应用程序在单独的线程或进程中运行检查点,则执行数据库查询和更新的主线程或进程永远不会阻止同步操作。
谢谢
发布于 2015-03-17 16:10:02
若要将fsync移动到另一个线程,请执行更改该线程中数据库的第一个操作。您可以使用一些无害的东西,比如PRAGMA user_version = 42 (假设您不使用用户版本)。
https://stackoverflow.com/questions/29103429
复制相似问题