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 大小,但可能会存储更多的页面和更大的磁盘访问量。
出于某种原因,我的主机似乎只有在设置为 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 大小,但可能会存储更多的页面和更大的磁盘访问量。