使用C# Entity Framework的SQLite WAL

3
由于某些原因,我的主机只有在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”之前使用。
使用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文件会继续增长吗,还是始终相对于数据库文件大小?

谢谢。


你读过https://www.sqlite.org/wal.html吗?它应该能回答你的问题(尤其是第6节)。 - Shawn
1个回答

4
这是预期的吗?
是的。WAL基本上与日志模式相反,它存储尚未应用于数据库文件的更改。
也就是说,使用WAL时更改不会被写入数据库文件,而是被写入-wal文件。当发生检查点(向前滚动)时,更改将被写入数据库文件并从-wal文件中有效地删除(但不一定释放磁盘空间)。
-wal实际上是数据库的一部分,即在访问底层数据库之前将从-wal文件中提取数据(如果数据不在-wal文件中)。
如果发生回滚,则可以(原则上)删除/删除-wal文件,回滚完成。
在JOURNAL模式下,更改被写入数据库文件并记录在-journal文件中。回滚会撤消更改。
是否有其他操作需要执行以提交任何更改并重置检查点?
关闭数据库时应该进行检查点,也可以使用PRAGMA schema.wal_checkpoint强制进行检查点,否则将自动应用检查点(大约每1000页)。

我的WAL文件会不断增长吗?还是始终与数据库文件大小有关?

不会不断增长,但在检查点发生之前会一直增长。它与数据库大小无关,而与所应用的更改(事务)相关。大小取决于数据库的页面大小,因为-wal文件存储已更改的页面。因此,较小的页面大小可能导致较小的-wal大小,但可能需要存储更多的页面并进行更多的磁盘访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接