SQLite WAL 与 C# Entity Framework

标签 sqlite c#-4.0 entity-framework-core wal

出于某种原因,我的主机似乎只能在设置为 WAL 模式时更新我的​​ SQLite 数据库。 因此,使用“DB Browser for SQLite”我将 Pragma Journal Mode 编辑为 WAL,一切似乎都正常。

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

WAL 文件显然是在“检查点”之前使用的

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

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 文件中删除(但不一定释放磁盘空间)。

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

如果发生回滚,则原则上可以删除/删除 -wal 文件,并且回滚完成。

在 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 大小,但可能会存储更多的页面和更大的磁盘访问量。

关于SQLite WAL 与 C# Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58105392/

相关文章:

linux - 错误 : Cannot find module '.../node_modules/sqlite3/lib/binding/node-v14-linux-x64/node_sqlite3.node'

sqlite - 如何插入但从多个表中获取数据

wpf - 如果我的背景是 C++/MFC,那么进入 VS2010、C# 4 和 WPF 的最佳方法是什么

asp.net - ASP.NET 5/ASP.NET Core 1 中的关注点分离和 n 层架构

entity-framework - Entity Framework Core 2.1 在左连接上抛出 ArgumentException

c# - 使用不同的 InMemory 数据库仍然增加身份

sqlite - 如果使用 Ebean ManyToOne 关系,数据库表会是什么样子?

android - 如何保护 Assets 文件夹中的数据库 sqlite(通过加密)?

c# - 将 IronPython 代码编译为 EXE 或 DLL

.net - 从 Delphi 到 .NET 4 的转换(无需任何工具)