Tôi có thể giới hạn cường độ fsync của webappstore (localst Storage) sqlite db không?


4

Các trình duyệt hiện đại có bộ nhớ cục bộ, được lưu trữ trong webappstore.sqlite (cho firefox) và localst Storage.sqlite (cho chrome).

Có một tập lệnh của bên thứ ba, (trình nhắn tin trực tuyến), sử dụng bộ nhớ cục bộ và thay đổi một số giá trị mỗi giây (chrome) hoặc thậm chí thường xuyên hơn (firefox, 2-3 lần mỗi giây).

Khóa lưu trữ cục bộ được thay đổi thường xuyên:

_STRG_fm_c hiện tại

tập lệnh là webagent-04052011092843.js

Tôi nghĩ rằng, công cụ sqlite trong broswer thực hiện fsync mỗi lần (hoặc mỗi giây) khi các giá trị trong bộ nhớ cục bộ bị thay đổi. Sử dụng Filemon, tôi cũng đã phát hiện công việc với các tệp .sqlite-Nhật ký, nhưng chúng bị xóa khi tôi cố gắng tìm chúng trong thư mục có lưu trữ cục bộ.

Có thể giới hạn tần suất sqlite thực hiện fsyncs của localst Storage db 'trong firefox và chrome không?

Câu trả lời:


2

Nếu bạn có một ứng dụng web đang sử dụng bộ nhớ cục bộ nặng đến mức gây ra vấn đề về hiệu suất, tôi sẽ liên hệ với tác giả ứng dụng web và cho họ biết, vì vậy có lẽ họ có thể khắc phục nó.

Tuy nhiên, SQLite không có một chế độ kể từ phiên bản 3.7.0 gọi là write-ahead khai thác gỗ trong đó sử dụng ít hoạt động fsync. Do cả hai phiên bản Chrome và Firefox mới hơn đều sử dụng ít nhất phiên bản 3.7.0 của SQLite, bạn có thể đặt chế độ WAL trên cơ sở dữ liệu lưu trữ cục bộ của mình và phải duy trì khi Chrome và Firefox bắt đầu sử dụng.

Bạn sẽ cần thực thi sqlite3 . Đóng Chrome trước , sau đó chạy các lệnh sau:

sqlite3 path/to/localstorage.sqlite

sqlite> PRAGMA journal_mode=WAL;
sqlite> .quit

(Khi bạn chạy PRAGMAlệnh, bạn sẽ nhận lại kết quả " wal".)

Các lệnh tương tự sẽ được sử dụng để đặt chế độ WAL cho cơ sở dữ liệu Firefox, thay thế webappstore.sqlitecho localstorage.sqlite.

Để hoàn tác cài đặt này, hãy chạy các lệnh tương tự, ngoại trừ sử dụng PRAGMA journal_mode=DELETE;.

Xin lưu ý rằng tôi đã không thử điều này bản thân mình; Tôi đoán là nó sẽ hoạt động tốt, nhưng tôi khuyên bạn nên sao lưu tệp cơ sở dữ liệu trước khi thử.


Bên cạnh đó, các *.sqlite-journaltệp bạn đang thấy trong Filemon là một phần trong cách SQLite thực hiện cam kết nguyên tử . Theo mặc định, tệp nhật ký chỉ tồn tại trong một thời gian rất ngắn. Khi cam kết thay đổi cơ sở dữ liệu SQLite, các hành động sau sẽ xảy ra:

  1. Dữ liệu hiện tại được ghi vào tệp tạp chí.
  2. Dữ liệu mới được ghi vào tệp cơ sở dữ liệu.
  3. Các tập tin tạp chí bị xóa.

Nếu máy tính gặp sự cố khi ghi tệp cơ sở dữ liệu, tệp nhật ký được sử dụng để khôi phục cơ sở dữ liệu trở lại trước khi thay đổi bắt đầu.


Tôi có thể tắt tạp chí (hoàn toàn không thực hiện fsync) và vô hiệu hóa các cam kết nguyên tử không? Mất điện là sự kiện rất hiếm gặp (2-3 mỗi năm ngay cả với UPS) và tôi không cần ACID cho lịch sử trình duyệt của mình. Nhưng việc xáo trộn dữ liệu giữa một số tệp dẫn đến phân mảnh tệp rất cao. Làm thế nào lớn nên sqlite-tạp chí?
osgx

1
@osgx: Bạn sẽ cần chạy Chrome / Firefox PRAGMA journal_mode=OFF(không giống như WAL, chạy nó từ chương trình sqlite3 sẽ không đặt nó cho các chương trình khác). Điều này có thể sẽ yêu cầu bạn biên dịch lại các trình duyệt đó từ nguồn. Kích thước tạp chí phụ thuộc vào kích thước của những thay đổi được thực hiện; Đối với ứng dụng này, các tạp chí nên khá nhỏ.
Stephen Jennings
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.