SQLite WAL с C # Entity Framework - PullRequest
       45

SQLite WAL с C # Entity Framework

1 голос
/ 25 сентября 2019

По какой-то причине мой хостинг, похоже, работает только при обновлении базы данных SQLite, когда он установлен в режиме WAL.Поэтому, используя «Браузер БД для SQLite», я изменил режим журнала Pragma на WAL, и все, кажется, работает.

Моя база данных теперь 1 МБ, но сопровождающий файл WAL составляет 4 МБ.Это ожидается?Я пытался прочитать о параметрах Pragma (https://www.sqlite.org/pragma.html#pragma_journal_mode), но в данный момент мне кажется, что это не так.

Файл WAL, очевидно, используется до "Checkpoint"

Используя Entity, я делаю следующее:

public DbSet<ProductModel> Products { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
    optionsBuilder.UseSqlite(@"Filename=" + dbPath);
} 

using (ProductDB db = new ProductDB())
{
    db.Products.Update(testModel);

    try
    {
         db.SaveChanges();
    }
}

Есть ли что-то еще, что я должен сделать, чтобы зафиксировать какие-либо изменения и сбросить контрольную точку? Будет ли мой WAL-файл продолжать расти или он всегда относительно базы данныхразмер файла?

Спасибо

1 Ответ

1 голос
/ 26 сентября 2019

Ожидается ли это?

Да.WAL в основном работает в режиме журнала, в котором хранятся изменения, которые еще предстоит применить к файлу базы данных.

То есть в WAL изменения не записываются в файл базы данных, а записываются в файл -wal.Когда происходит проверка-указание (откат), изменения затем записываются в файл базы данных и эффективно удаляются из файла -wal (но не обязательно освобождают место на диске).

-wal фактически является частьюбазы данных, т.е. данные будут извлечены из файла -wal до того, как будет получен доступ к базовой базе данных (если данные не были в файле -wal).

Если происходит откат, то файл -wal может(в принципе) удаляется / удаляется, и откат завершается.

В режиме JOURNAL изменения записываются в файл базы данных и регистрируются в файле -journal.Откат отменяет изменения.

Есть ли что-то еще, что я должен сделать, чтобы зафиксировать любые изменения и сбросить контрольную точку?

Закрытие базы данных должно стать контрольной точкой,Вы также можете принудительно навести чек, используя PRAGMA schema.wal_checkpoint , в противном случае применяется автоматическая контрольная точка (приблизительно после 1000 страниц).

Будет ли мой WAL-файл продолжать расти или он всегда будет относительнымк размеру файла базы данных?

Нет, он не будет расти, но будет, пока не произойдет контрольная точка.Это не относится к размеру базы данных, но относится к применяемым изменениям (транзакциям).Размер зависит от размера страницы базы данных, так как -wal fil хранит измененные страницы.Таким образом, меньший размер страницы может привести к меньшему размеру -wal, но тогда может быть сохранено больше страниц и больше доступа к диску.

...