出于某种原因,我的主机似乎只能在设置为 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/