我可以限制 webappstore(localstorage)sqlite db 的 fsync 强度吗?

我可以限制 webappstore(localstorage)sqlite db 的 fsync 强度吗?

现代浏览器都有本地存储,存储在webappstore.sqlite(对于firefox)和localstorage.sqlite(对于chrome)。

有一个第三方脚本(在线信使),它使用本地存储并每秒(chrome)或更频繁地更改某些值(firefox,每秒 2-3 次)。

经常更改的本地存储密钥:

_STRG_fm_current

脚本是 webagent-04052011092843.js

我认为,每次(或每秒)本地存储中的值发生变化时,浏览器中的 sqlite 引擎都会执行一次 fsync。使用 Filemon,我还检测到了 .sqlite-journal 文件的工作,但当我尝试在本地存储文件夹中找到它们时,它们被删除了。

是否可以限制 sqlite 在 firefox 和 chrome 中对本地存储数据库进行 fsync 的频率?

答案1

如果您的 Web 应用程序大量使用本地存储,以致于导致性能问题,我会联系 Web 应用程序作者并告知他们,这样他们或许可以修复它。

但是,SQLite自 3.7.0 版本以来,有一个名为预写日志它使用更少的 fsync 操作。由于较新版本的 Chrome 和 Firefox 都至少使用 3.7.0 版 SQLite,因此您可能能够在本地存储数据库上设置 WAL 模式,并且当 Chrome 和 Firefox 开始使用它时,它应该会持续存在。

你需要sqlite3 可执行文件首先关闭 Chrome,然后运行以下命令:

sqlite3 path/to/localstorage.sqlite

sqlite> PRAGMA journal_mode=WAL;
sqlite> .quit

(当您运行该PRAGMA命令时,您应该得到结果“ wal”。)

相同的命令可用于设置 Firefox 数据库的 WAL 模式,webappstore.sqlite替代localstorage.sqlite

要撤消此设置,请运行相同的命令,但使用PRAGMA journal_mode=DELETE;

请注意,我有不是我自己尝试过这个;我猜它会工作正常,但我建议您在尝试之前备份数据库文件。


顺便说一句,*.sqlite-journal您在 Filemon 中看到的文件是 SQLite 执行原子提交默认情况下,日志文件仅存在很短的时间。向 SQLite 数据库提交更改时,会发生以下操作:

  1. 当前数据被写入日志文件。
  2. 新数据被写入数据库文件。
  3. 日志文件已被删除。

如果计算机在写入数据库文件的过程中崩溃,则日志文件可用于将数据库恢复到更改开始之前的状态。

相关内容