SQLite WAL 与 C# Entity Framework

SQLite WAL with the C# Entity Framework

出于某种原因,我的主机似乎只有在设置为 WAL 模式时才能更新我的 SQLite 数据库。 所以使用 "DB Browser for SQLite" 我将 Pragma Journal Mode 编辑为 WAL,一切似乎都有效。

我的数据库现在是 1Mb,但是随附的 WAL 文件是 4Mb。这是预期的吗? 我一直在尝试阅读 Pragma 选项 (https://www.sqlite.org/pragma.html#pragma_journal_mode),但现在似乎超出了我的理解范围。

WAL 文件显然是在 "Checkpoint"

之前使用的

我使用实体执行以下操作:

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 文件会继续增长,还是总是相对于数据库文件大小?

谢谢

Is this expected?

是的。 WAL 的工作方式基本上与日志模式相反,它存储尚未应用于数据库文件的更改。

也就是说,对于 WAL,更改不会写入数据库文件,而是写入 -wal 文件。当发生检查点(前滚)时,更改将写入数据库文件并有效地从 -wal 文件中删除(但不一定释放磁盘 space)。

-wal 实际上是数据库的一部分,即数据将在访问基础数据库之前从 -wal 文件中提取(如果数据不在 -wal 文件中)。

如果发生回滚,那么 -wal 文件可以(原则上)是 dropped/deleted 并且回滚完成。

在 JOURNAL 模式下,更改将写入数据库文件并记录在 -journal 文件中。回滚会撤消更改。

Is there something extra I should be doing to commit any changes and reset a checkpoint?

关闭数据库应该检查点,您也可以使用 PRAGMA schema.wal_checkpoint 强制检查点,否则应用自动检查点(大约在 1000 页后)。

Will my WAL file keep growing, or is it always relative to the database filesize?

不,它不会继续增长,但会一直增长到检查点发生。它与数据库大小无关,而是与应用的更改(事务)相关。大小取决于数据库的页面大小,因为 -wal fil 存储更改的页面。因此,较小的页面大小可能会导致较小的 -wal 大小,但可能会存储更多的页面和更大的磁盘访问量。