我在Fluent NHibernate项目中使用SQLite( system.data.sqlite v.1.0.60.0 )。
我有一个程序写入DB,另一个程序从中读取。偶尔,我会得到SQLITE_BUSY异常,我需要解决这个问题。
我发现了几个谷歌对 sqlite_busy_timeout 的引用,如果我理解正确的话,会导致SQLite在抛出异常之前重试。这可能足以满足我的需求。
但是,这似乎不在system.data.sqlite程序集中。
当我使用对象浏览器搜索 SetTimeout 时,我得到两个点击:
System.Data.SQLite.SQLite3.SetTimeout(int)的
System.Data.SQLite.SQLiteBase.SetTimeout(int)的
但我似乎无法在我的代码中使用它们 - 它们没有显示在Intellisense中,而VS2008显示了SQLite3的红色下划线,并显示消息“无法在此处访问内部类”。
任何人都可以给我一个示例(在C#中),它显示了此方法的确切语法吗?
或者这是正确的方法吗?我可以在我的代码中检查SQLITE_BUSY,但是没有找到任何证明这种方法的好例子。
最后,Fluent NHibernate或NHibernate有没有任何机制来提供对SQLite数据库的简单共享访问?
答案 0 :(得分:1)
SetTimeout
是两个NHibernate查询接口ICriteria
和IQuery
的成员。
示例:
using (var session = sessionFactory.OpenSession())
using (var tx = session.BeginTransaction())
{
var items = session.CreateQuery("select something complex from a big table")
.SetTimeout(600) // 10 minutes
.List();
tx.Commit();
}
答案 1 :(得分:1)
就像你说的那样,SetTimeout() is internal,所以你(或NHibernate)不能称之为。该方法仅包装
sqlite_busy_timeout
并抛出,您绝对不希望在应用程序代码中使用这些不安全的方法。
根据this,SQLite提供程序应重试30秒。