2010-06-21 87 views
2

我在Fluent NHibernate項目上使用SQLite(system.data.sqlite v。1.0.60.0)。任何人都可以提供一個SQLite「SetTimeout」的C#示例嗎?

我有一個程序寫入數據庫,另一個讀取它。偶爾,我會遇到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,但是還沒有找到證明這種方法的好例子。

最後,做流利NHibernate或NHibernate有任何機制提供簡單的共享訪問SQLite數據庫?

回答

1

就像你說的,SetTimeout() is internal,所以你(或NHibernate的)不能調用它。該方法只包裝
sqlite_busy_timeout並拋出,並且您肯定不希望在應用程序代碼中使用這些不安全的方法。

根據this,SQLite提供程序應該重試30秒。

+0

謝謝!有什麼方法可以將超時設置爲較短的時間間隔(比如5秒),以加快測試速度? – 2010-06-23 16:23:57

+0

@Tom Bushell:老實說,如果您需要這種併發性,我會推薦使用其他數據庫引擎。嵌入式數據庫引擎通常不適合於此。 – 2010-06-23 20:55:44

+0

我們的併發需求非常少,似乎SQLite應該足夠用於這項工作。目前還不清楚爲什麼它還沒有工作。 – 2010-06-24 18:11:30

1

SetTimeout是NHibernate查詢接口ICriteriaIQuery的成員。

例子:

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(); 
} 
+0

感謝您的回覆 - 我要試試這個。另外,我很糟糕地表述了我的問題 - 我實際上是想直接設置SQLite超時。做了重大改寫 - 希望現在更清楚。 – 2010-06-22 15:35:41

相關問題