2012-01-03 23 views
6

Podczas sprawdzania RavenDB zauważam, że nie od razu uzyskuje oczekiwane wyniki. Może to ma związek z indeksowaniem, nie wiem.RavenDB - problem z odpytaniem - Stale wyniki/indeksy

Na przykład:

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

Kiedy wykonać to wtedy ACount i BCount uzyskać ich wartości bezpośrednio po pierwszym uruchomieniu). Jednak CCount i DCount nie otrzymują swoich wartości aż po trzech lub czterech przebiegach. Pokazują 0 (zero) wartości w pierwszych kilku seriach.

Dlaczego tak się dzieje w przypadku dwóch ostatnich pytań, a nie dwóch? Jeśli jest to wynikiem nieaktualnych wyników (lub indeksów), to w jaki sposób mogę zmodyfikować moje zapytania, aby uzyskać dokładne wyniki za każdym razem, gdy uruchamiam je po raz pierwszy. Dziękuje Ci za pomoc.

Odpowiedz

14

Jeśli nie zdefiniowałeś indeksu dla zapytania Filmy, Raven utworzy Dynamic Index. Jeśli wielokrotnie użyjesz zapytania, indeks zostanie automatycznie utrwalony. W przeciwnym razie Raven odrzuci go i to może wyjaśnić, dlaczego uzyskujesz 0 wyników podczas pierwszych kilku prób.

Można także nakazać Raven czekać na proces indeksowania, aby upewnić się, że będziesz zawsze uzyskać najbardziej dokładne wyniki (choć to może nie być dobrym pomysłem, ponieważ będzie ona spowolnić zapytania) za pomocą WaitForNonStaleResults instrukcja:

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

Jak rozwiązać problem z przekroczeniem limitu czasu? Otrzymuję błąd przekroczenia limitu czasu, gdy używam funkcji .waitfornonstaleresults() w zapytaniu. – ZVenue

+0

Wyjątek TimeOutException nieobsługiwany przez kod użytkownika: {"Poczekał 15.250ms, aby zapytanie zwróciło nieaktualny wynik."} - jest to wiadomość. . – ZVenue

+3

Użyłem .... Dostosuj (x => x.WaitForNonStaleResults (TimeSpan.FromSeconds (100)), aby naprawić wyjątek limitu czasu. – ZVenue

1

która chciałaby umieścić WaitForNonStaleResults w każdym zapytaniu czuje masową „zapachy kodu” (tak samo jak ja normalnie nienawidzę termin wydaje się całkowicie stosowne tutaj).

Jedynym rozwiązaniem znalazłem tak daleko jest:

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

Wydajność cierpi odpowiednio, ale myślę wolniej wydajność jest znacznie mniejszy grzech niż zawodne, jeśli nie wręcz niedokładnych wyników.

0

Dostępne są następujące opcje zgodnie z the official documentation (najbardziej korzystne pierwszy):

  1. Ustawienie punktu odcięcia.

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

    Pozwoli to upewnić się, że masz najnowsze wyniki do tego punktu w czasie (lub do ostatniego zapisu). I możesz umieścić na nim czapkę (np. 10s), jeśli chcesz poświęcić świeżość wyników, aby szybciej otrzymać odpowiedź.

  2. Wyraźnie czekał na non-nieświeży wyników WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))

    Ponownie, określając limit czasu byłoby dobrą praktyką.

  3. Ustawienie odpytywanie konwencje zastosować tę samą zasadę do wszystkich żądań

    store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite.