Posso limitar a intensidade de fsync de webappstore (localstorage) sqlite db?

4

Os navegadores modernos têm armazenamento local, que é armazenado em webappstore.sqlite (para o firefox) e localstorage.sqlite (para o chrome).

Existe um script de terceiros, (mensageiro on-line), que usa armazenamento local e altera algum valor a cada segundo (chrome) ou até mais frequentemente (firefox, 2-3 vezes por segundo).

Chave de armazenamento local que é alterada com frequência:

_STRG_fm_current

O script

é webagent-04052011092843.js

Eu acho que o mecanismo sqlite no broswer faz um fsync toda vez (ou a cada segundo) quando os valores no armazenamento local são alterados. Usando o Filemon, também detectei o trabalho com arquivos .sqlite-journal, mas eles são excluídos quando tento encontrá-los na pasta com localstorage.

É possível limitar com que frequência o sqlite executará fsyncs de db's de armazenamento local no firefox e no cromo?

    
por osgx 07.05.2011 / 16:25

1 resposta

2

Se você tem um aplicativo da Web que usa armazenamento local tão strongmente que causa problemas de desempenho, eu entrarei em contato com o autor do aplicativo da web e informe-os, então talvez eles possam corrigir isso.

No entanto, o SQLite tem um modo desde a versão 3.7.0 chamada logging write-ahead que usa menos operações de fsync. Como as versões mais recentes do Chrome e do Firefox usam pelo menos a versão 3.7.0 do SQLite, você pode definir o modo WAL no banco de dados de armazenamento local e persistir quando o Chrome e o Firefox começarem a usá-lo.

Você precisará do executável sqlite3 . Feche primeiro o Chrome e, em seguida, execute os seguintes comandos:

sqlite3 path/to/localstorage.sqlite

sqlite> PRAGMA journal_mode=WAL;
sqlite> .quit

(Quando você executa o comando PRAGMA , você deve recuperar o resultado " wal ".)

Os mesmos comandos seriam usados para definir o modo WAL para o banco de dados do Firefox, substituindo webappstore.sqlite por localstorage.sqlite .

Para desfazer essa configuração, execute os mesmos comandos, exceto o uso PRAGMA journal_mode=DELETE; .

Por favor, note que eu não tentei isso sozinho; Meu palpite é que ele funcionará bem, mas peço que faça backup do arquivo do banco de dados antes de tentar.

Como um aparte, os arquivos *.sqlite-journal que você está vendo no Filemon são parte de como o SQLite realiza um commit atômico . Por padrão, o arquivo de diário existe apenas por um tempo muito curto. Ao confirmar uma alteração em um banco de dados SQLite, as seguintes ações ocorrem:

  1. Os dados atuais são gravados no arquivo de diário.
  2. Os novos dados são gravados no arquivo de banco de dados.
  3. O arquivo de diário é excluído.

Se o computador travar no meio da gravação do arquivo de banco de dados, o arquivo de diário será usado para recuperar o banco de dados antes que a alteração seja iniciada.

    
por 27.05.2012 / 21:00