不能使用 SQLite WAL 模式

本文关键字:WAL 模式 SQLite 不能 | 更新日期: 2023-09-27 18:33:29

我在SQLite上使用带有NHibernate的c#。System.Data.SQLite version 1.0.88SQLite 版本 3.7.17

我最近发现了SQLite WAL模式,它看起来正是我所需要的。问题是我似乎无法让它工作。

文档仅声明:

要转换为 WAL 模式,请使用以下杂注:

普拉格玛journal_mode=沃尔;

journal_mode杂注返回一个字符串,该字符串是新的日志模式。成功后,杂注将返回字符串"沃尔"。如果无法完成到 WAL 的转换(例如,如果 VFS 不支持必要的共享内存原语(然后日记模式将保持不变,并返回字符串从基元将是先前的日记模式(例如"删除"(。

我已经在代码中尝试过这个:

ISQLQuery query = session.CreateSQLQuery("PRAGMA journal_mode=WAL;");
object result = query.UniqueResult();

以及在SQLiteman管理应用程序中。

在每种情况下,我都会得到一个返回值"删除",即数据库无法进入 WAL 模式。问题是,我不知道为什么。我在文档中可以看到的唯一可能性是您的文件系统不支持共享内存原语,但我使用的是 Win 7,所以这不是问题。

任何想法如何启用 WAL 模式或找出它不起作用的原因?

不能使用 SQLite WAL 模式

尝试在连接生成器上设置杂注。

SQLiteConnectionStringBuilder connBuilder = new SQLiteConnectionStringBuilder();
connBuilder.JournalMode = SQLiteJournalModeEnum.Wal;

看看这个:System.data.sqlite - 激活 WAL 日志模式

找到了答案。似乎需要在首次创建连接时设置日志模式。(我还没有找到任何明确的文档,但这是我让它工作的唯一方法(

我现在在创建连接字符串时指定日志模式:

SQLiteConnectionStringBuilder connectionStringBuilder = new SQLiteConnectionStringBuilder();
connectionStringBuilder.DataSource = dbFile;
connectionStringBuilder.JournalMode = SQLiteJournalModeEnum.Wal;

然后,我的 Fluent NHbiernate 配置使用这个:

SQLiteConfiguration.Standard.ConnectionString(connectionStringBuilder.ToString())

SQLite 实际上不会更改日记模式,直到向数据库发出写入(或读取?(。我不熟悉 C# 接口,但我在 Objective C 接口上看到了它。