Kann ich die Intensität von fsync von sqlite db für webappstore (localstorage) begrenzen?

978
osgx

Moderne Browser verfügen über lokalen Speicher, der in webappstore.sqlite (für Firefox) und localstorage.sqlite (für Chrome) gespeichert wird.

Es gibt ein Drittanbieter-Skript (Online Messenger), das lokalen Speicher verwendet und jede Sekunde (Chrome) oder sogar häufiger (Firefox, 2-3 Mal pro Sekunde) einen bestimmten Wert ändert.

Lokaler Speicherschlüssel, der so oft geändert wird:

_STRG_fm_current

Skript ist webagent-04052011092843.js

Ich denke, dass die sqlite-Engine in broswer jedes Mal (oder jede Sekunde) einen fsync ausführt, wenn die Werte im lokalen Speicher geändert werden. Mit Filemon erkannte ich auch die Arbeit mit .sqlite-journal-Dateien, die jedoch gelöscht werden, wenn ich sie im Ordner localstorage finde.

Ist es möglich zu begrenzen, wie oft sqlite Fsyncs von localstorage db's in Firefox und Chrome ausführen wird?

4

1 Antwort auf die Frage

2
Stephen Jennings

Wenn Sie über eine Webanwendung verfügen, die den lokalen Speicher so stark nutzt, dass Leistungsprobleme auftreten, würde ich den Autor der Webanwendung kontaktieren und sie benachrichtigen, damit sie ihn möglicherweise beheben können.

SQLite verfügt jedoch seit Version 3.7.0 über einen Modus, der als Write-Ahead-Protokollierung bezeichnet wird und weniger fsync-Vorgänge verwendet. Da neuere Versionen von Chrome und Firefox mindestens die Version 3.7.0 von SQLite verwenden, können Sie möglicherweise den WAL-Modus für Ihre lokale Speicherdatenbank einstellen. Wenn Chrome und Firefox damit beginnen, sollte dieser Modus beibehalten werden.

Sie benötigen die ausführbare Datei sqlite3 . Schließen Sie zuerst Chrome und führen Sie dann die folgenden Befehle aus:

sqlite3 path/to/localstorage.sqlite  sqlite> PRAGMA journal_mode=WAL; sqlite> .quit 

(Wenn Sie den PRAGMABefehl ausführen, sollten Sie das Ergebnis " wal" zurückbekommen .)

Die gleichen Befehle verwendet werden würden WAL - Modus für die Firefox - Datenbank einzustellen, ersetzt webappstore.sqlitefür localstorage.sqlite.

Um diese Einstellung rückgängig zu machen, führen Sie dieselben Befehle mit Ausnahme der Verwendung von aus PRAGMA journal_mode=DELETE;.

Bitte beachten Sie, dass ich dies selbst nicht ausprobiert habe. Meine Vermutung ist, dass es gut funktionieren wird, aber ich fordere Sie dringend auf, die Datenbankdatei zu sichern, bevor Sie es versuchen.


Abgesehen davon sind die *.sqlite-journalDateien, die Sie in Filemon sehen, ein Teil davon, wie SQLite eine atomare Festschreibung durchführt . Standardmäßig ist die Journaldatei nur für sehr kurze Zeit vorhanden. Wenn Sie eine Änderung an einer SQLite-Datenbank vornehmen, werden folgende Aktionen ausgeführt:

  1. Die aktuellen Daten werden in die Journaldatei geschrieben.
  2. Die neuen Daten werden in die Datenbankdatei geschrieben.
  3. Die Journaldatei wird gelöscht.

Wenn der Computer während des Schreibens der Datenbankdatei abstürzt, wird die Datenbank vor dem Beginn der Änderung mithilfe der Journaldatei wiederhergestellt.

Kann ich journal deaktivieren (ohne fsync zu machen) und atomische Commits deaktivieren? Stromausfall ist ein sehr seltenes Ereignis (2-3 pro Jahr, auch ohne USV), und ich brauche keine SÄURE für meinen Browserverlauf. Das Mischen von Daten zwischen mehreren Dateien führt jedoch zu einem sehr hohen Maß an Dateifragmentierung. Wie groß sollte das sqlite-journal sein? osgx vor 11 Jahren 0
@osgx: Sie müssten Chrome / Firefox dazu bringen, `PRAGMA journal_mode = OFF` auszuführen (im Gegensatz zu WAL wird das Ausführen mit dem Programm sqlite3 nicht für andere Programme festgelegt). Dies erfordert wahrscheinlich, dass Sie diese Browser aus der Quelle neu kompilieren. Die Journalgröße hängt von der Größe der vorgenommenen Änderungen ab. Für diese Anwendung sollten die Zeitschriften ziemlich klein sein. Stephen Jennings vor 11 Jahren 1