我在Debian 7上使用SQLite 3.7.13时遇到了一个有趣的问题。
我使用SQLite和#34; PRAGMA journal_mode = wal"和" PRAGMA同步=正常"尝试避免Python程序的主事件循环中的fsyncs。正如文档中所建议的那样,我已禁用自动检查点,并且我会定期运行" PRAGMA wal_checkpoint"在不同的线程中将最新数据同步到磁盘。
这是有效的但是我发现在主程序线程中的检查点之后的第一次插入操作导致对WAL文件本身的一次性fsync调用。任何进一步的插入操作都不会导致fsync。我已经使用strace验证了这一点。
查看SQLite文档,它说:
在检查点之后开始重用WAL文件时,WAL文件头被同步
我正在寻找一种方法来防止主线程中出现任何fsyncs,但这仍然允许我从另一个线程执行定期检查点。是否有更多可以在检查点线程中完成以避免主线程中的fsync?
我已经看过" synchronous = off"但是这也阻止了检查点的fsyncs。
注意:对于两个线程中的每个线程,我都有一个单独的数据库连接(如果相关)
进一步说明:文档似乎在别处说过不应该是fsync,但观察到的行为明显不同:
请注意,在PRAGMA同步设置为NORMAL的情况下,检查点是发出I / O屏障或同步操作的唯一操作(Windows上的unix或FlushFileBuffers()上的fsync())。因此,如果应用程序在单独的线程或进程中运行检查点,则执行数据库查询和更新的主线程或进程将永远不会阻止同步操作。
由于
答案 0 :(得分:0)
要将该fsync移动到另一个线程,请执行第一个更改该线程中数据库的操作。
您可以使用像PRAGMA user_version = 42
这样无害的内容(假设您不使用user version)。