2012-01-03 65 views
6

查詢RavenDB時,我注意到它沒有立即得到預期的結果。可能與索引有關,我不知道。RavenDB - 查詢問題 - 陳舊的結果/索引

例如:

int ACount = session.Query<Patron>() 
        .Count(); 

    int BCount = session.Query<Theaters>() 
        .Count(); 

    int CCount = session.Query<Movies>() 
        .Where(x => x.Status == "Released")            
        .Count(); 

    int DCount = session.Query<Promotions>() 
        .Count(); 

當我執行這項然後ACountBCount立即得到第一次運行它們的值)。然而,CCountDCount直到三或四次運行後才能得到它們的值。它們在前幾次運行中顯示0(零)值。

爲什麼這會發生在底部而不是頂部兩個查詢中?如果由於陳舊的結果(或索引),那麼當我第一次運行它時,如何每次修改我的查詢以獲得準確的結果。謝謝你的幫助。

回答

14

如果您尚未定義Movies查詢的索引,Raven將創建一個Dynamic Index。如果重複使用查詢,索引將自動保持。否則Raven會放棄它,這可能解釋爲什麼你在前幾次運行中得到0結果。

您還可以指示烏鴉等待索引過程,以確保你總是使用WaitForNonStaleResults得到最準確的結果(儘管這可能不是因爲它會減慢你的查詢是個好主意)說明:

session.Query<Movies>() 
.Customize(x => x.WaitForNonStaleResults()) 
.Where(x => x.Status == "Released")            
.Count(); 
+0

如何解決超時問題?我在查詢中使用.waitfornonstaleresults()時遇到了超時錯誤。 – ZVenue 2012-01-03 16:47:36

+0

TimeOutException未由用戶代碼處理:{「等待15,250ms查詢返回非陳舊結果。」} - 是消息。 。 – ZVenue 2012-01-03 16:49:08

+3

我用...。 Customize(x => x.WaitForNonStaleResults(TimeSpan.FromSeconds(100)))來修復超時異常。 – ZVenue 2012-01-03 17:02:05

1

孤男寡女把WaitForNonStaleResults在每個查詢感覺就像一個巨大的「代碼味道」(就像我常恨術語,似乎完全合適的位置)。

唯一能解決問題,到目前爲止,我發現是:

var store = new DocumentStore(); // do whatever 
store.DatabaseCommands.DisableAllCaching(); 

性能相應受到影響,但我認爲較慢的性能遠遠高於不可靠甚至完全不準確的結果少了罪。

0

你可以根據the official documentation(最優選的第一)有以下幾種選擇:

  1. 設置分界點

    WaitForNonStaleResultsAsOfLastWrite(TimeSpan.FromSeconds(10))WaitForNonStaleResultsAsOfNow()

    這將確保你得到的最新結果到那個時間點(或直到最後寫)。如果您想犧牲結果的新鮮度以更快地接收響應,您可以在其上設置一個上限(例如10秒)。

  2. 明確等待未失效的結果 WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))

    再次,指定超時將是一個很好的做法。

  3. 設置查詢約定適用相同的規則對所有要求

    store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite