我在SQLite上使用c#和NHibernate。 System.Data.SQLite版本1.0.88 SQLite版本3.7.17
我最近发现了SQLite WAL mode,它看起来就像我需要的那样。 问题是我似乎无法让它发挥作用。
文档简单说明:
要转换为WAL模式,请使用以下编译指示:
PRAGMA journal_mode = WAL;
journal_mode pragma返回一个字符串 新的期刊模式。成功时,pragma将返回字符串 "沃&#34 ;.如果无法完成到WAL的转换(例如, 如果VFS不支持必要的共享内存原语) 然后日记模式将保持不变并返回字符串 来自原语将是先前的日记模式(例如 "删除"。)
我在代码中尝试了这个:
ISQLQuery query = session.CreateSQLQuery("PRAGMA journal_mode=WAL;");
object result = query.UniqueResult();
并在SQLiteman管理应用程序中。
在每种情况下,我都会得到&#39; delete&#39;的返回值。即数据库无法进入WAL模式。 麻烦的是,我不知道为什么..我在文档中看到的唯一可能性是你的文件系统不支持共享内存的主要内容,但是我在Win 7上是这样,这不是问题。< / p>
我有什么想法可以启用WAL模式或弄清楚它为什么不起作用?
答案 0 :(得分:7)
尝试在连接构建器上设置pragma。
SQLiteConnectionStringBuilder connBuilder = new SQLiteConnectionStringBuilder();
connBuilder.JournalMode = SQLiteJournalModeEnum.Wal;
答案 1 :(得分:2)
找到答案。 似乎需要在首次创建连接时设置日志模式。 (我没有找到任何文件说明确定,但这是我能让它工作的唯一方法)
我现在在创建连接字符串时指定日志模式:
SQLiteConnectionStringBuilder connectionStringBuilder = new SQLiteConnectionStringBuilder();
connectionStringBuilder.DataSource = dbFile;
connectionStringBuilder.JournalMode = SQLiteJournalModeEnum.Wal;
我的Fluent NHbiernate配置然后使用它:
SQLiteConfiguration.Standard.ConnectionString(connectionStringBuilder.ToString())
答案 2 :(得分:1)
SQLite实际上不会更改日记模式,直到向数据库发出写入(或读取?)为止。我不熟悉C#界面,但我已经通过Objective C界面看到了它。