无法使用SQLite WAL模式

3

我正在使用C#和NHibernate开发SQLite。 System.Data.SQLite版本为1.0.88,SQLite版本为3.7.17。

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

文档简单地说明:

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

PRAGMA journal_mode=WAL;

journal_mode pragma返回一个字符串,表示新的日志模式。成功后,pragma将返回字符串“wal”。如果无法完成转换到WAL(例如,如果VFS不支持必要的共享内存原语),则日志记录模式将保持不变,并从原始原语返回字符串作为先前的日志记录模式(例如“delete”)。

我已经尝试在代码中执行这个操作:

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

并且在SQLiteman管理应用程序内部。

在每种情况下,我都得到一个'return'值。也就是说,数据库无法进入WAL模式。 问题是,我不知道为什么。文档中唯一可能的原因是您的文件系统不支持共享内存基元,但我使用的是Win 7,所以这不是问题。

有什么办法可以启用WAL模式或找出为什么它不起作用吗?

3个回答

7
尝试在您的连接构建器上设置pragma。
SQLiteConnectionStringBuilder connBuilder = new SQLiteConnectionStringBuilder();
connBuilder.JournalMode = SQLiteJournalModeEnum.Wal;

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


2

SQLite在执行写入(或读取?)操作之前并不会实际更改日志模式。我对C#接口不熟悉,但我在Objective C接口中看到过这种情况。


2

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

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

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

我的流利NHibernate配置然后使用这个:

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

没错,这就是正确的方式。 - D.Rosado

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接