2012-01-03 26 views
6

RavenDB'yi sorgularken, beklenen sonuçları hemen almadığını fark ettim. Endeksleme ile ilgisi olabilir, bilmiyorum. ÖrneğinRavenDB - sorgulama sorunu - Eski sonuçlar/dizinler

:

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(); 

bu daha sonra ACount ve BCount ilk çalıştırmada hemen değerlerini almak yürütmek). Ancak CCount ve DCount, üç veya dört çalıştırmadan sonra değerlerini alamaz. İlk birkaç koşuda 0 (sıfır) değeri gösterirler.

Bu durum neden en üstteki iki sorgu için değil, ikinci ikisi için oluyor? Eski sonuçları nedeniyle (veya dizinler), ilk defa çalıştırdığımda her seferinde doğru sonuçları almak için sorgularımı nasıl değiştirebilirim. Yardımın için teşekkürler.

cevap

14

Filmler sorgusu için bir dizin tanımlamamışsanız, Raven bir Dynamic Index oluşturur. Sorguyu tekrar tekrar kullanırsanız, dizin otomatik olarak devam eder. Aksi halde, Raven onu reddeder ve bu, ilk birkaç çalışma sırasında neden 0 sonuç aldığınızı açıklayabilir.

Ayrıca (bu sizin sorguları yavaşlatır olarak iyi bir fikir olmayabilir bile) her zaman WaitForNonStaleResults kullanarak en doğru sonuçları elde edersiniz sağlamak için dizin oluşturma işlemi için beklemek Raven talimat verebilirsiniz talimat:

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

Zaman aşımı sorununu nasıl gideririm? Sorguda .waitfornonstaleresults() kullanırken bir zaman aşımı hatası alıyorum. – ZVenue

+0

TimeOutException, kullanıcı kodu tarafından işlenmemiş: {"Sorunun eski olmayan bir sonucu döndürmesi için 15,250 ms bekleniyor."} - iletidir. . – ZVenue

+3

Kullanıyorum .... Zaman aşımı istisnasını düzeltmek için (x => x.WaitForNonStaleResults (TimeSpan.FromSeconds (100))) özelleştirin. – ZVenue

1

her sorguda WaitForNonStaleResults koymak ihtiyacı büyük "kod koku" gibi hissediyor (normalde terimini nefret kadar, burada tamamen uygun görünüyor).

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

Performans buna göre uğrar, ama ben yavaş performans düpedüz yanlış değil sonuçların ise güvenilmez daha günahın çok daha az olduğunu düşünüyorum:

Ben şimdiye kadar bulduğum tek gerçek çözümdür.

0

Sen (en tercih birinci) the official documentation göre aşağıda belirtilen seçenekler vardır:

  1. Ayar kesme noktasını.

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

    Bu zaman içinde bu noktaya kadar son sonuçlar elde sağlayacağız (veya son yazma kadar). Ve daha hızlı yanıt almak için sonuçların tazeliğini feda etmek istiyorsanız, üzerine bir kapak koyabilirsiniz (örneğin, 10s).

  2. Açıkça iyi bir uygulama olacak bir zaman aşımı belirterek, Yine olmayan bayat sonuçları WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))

    bekliyor.

  3. Ayar sorgulama konvansiyonlar tüm istekleri

    store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite aynı kuralı uygulamak için.