现代浏览器都有本地存储,存储在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 数据库提交更改时,会发生以下操作:
- 当前数据被写入日志文件。
- 新数据被写入数据库文件。
- 日志文件已被删除。
如果计算机在写入数据库文件的过程中崩溃,则日志文件可用于将数据库恢复到更改开始之前的状态。