3

我在 SQLite 上使用 c# 和 NHibernate。System.Data.SQLite 版本 1.0.88 SQLite 版本 3.7.17

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

该文档简单地指出:

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

PRAGMA journal_mode=WAL;

journal_mode pragma 返回一个字符串,它是新的日志模式。成功时,编译指示将返回字符串“wal”。如果无法完成到 WAL 的转换(例如,如果 VFS 不支持必要的共享内存原语),那么日志模式将保持不变,并且从原语返回的字符串将是先前的日志模式(例如“删除”)。

我在代码中都试过了:

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

SQLiteman管理应用程序中。

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

任何想法如何启用 WAL 模式或找出它为什么不起作用?

4

3 回答 3

7

尝试在您的连接构建器上设置编译指示。

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

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

于 2013-10-01T09:18:56.250 回答
2

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

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

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

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

SQLiteConfiguration.Standard.ConnectionString(connectionStringBuilder.ToString())
于 2013-10-01T09:18:04.120 回答
2

在向数据库发出写入(或读取?)之前,SQLite 实际上不会更改日志模式。我不熟悉 C# 接口,但我在 Objective C 接口中见过它。

于 2014-01-29T07:57:15.870 回答