SQLite WAL с C# Entity Framework

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

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

Файл WAL, по-видимому, используется перед «Контрольной точкой».

Используя 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 продолжать расти или он всегда зависит от размера файла базы данных?

Спасибо


person Richard Whitehouse    schedule 25.09.2019    source источник
comment
Вы читали sqlite.org/wal.html? Он должен отвечать на ваши вопросы (особенно раздел 6)   -  person Shawn    schedule 25.09.2019


Ответы (1)


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

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

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

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

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

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

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

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

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

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

person MikeT    schedule 26.09.2019