2012-01-03 10 views
6

Durante la richiesta di RavenDB, noto che non ottiene immediatamente i risultati attesi. Può essere che abbia a che fare con l'indicizzazione, non lo so.RavenDB - problema di interrogazione - risultati/indici stanti

Ad esempio:

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

Quando eseguo questo allora ACount e BCount ottenere i loro valori subito alla prima esecuzione). Tuttavia, CCount e DCount non ottengono i loro valori fino a dopo tre o quattro cicli. Mostrano il valore 0 (zero) nelle prime esecuzioni.

Perché ciò si verifica per le due domande in basso e non per quelle superiori? Se è a causa di risultati obsoleti (o indici), come posso modificare le mie query per ottenere sempre risultati accurati, quando lo eseguo la prima volta. Grazie per il tuo aiuto.

risposta

14

Se non è stato definito un indice per la query Filmati, Raven creerà un Dynamic Index. Se si utilizza la query ripetutamente, l'indice verrà automaticamente mantenuto. Altrimenti Raven lo scarterà e questo potrebbe spiegare perché stai ottenendo 0 risultati durante le prime esecuzioni.

È inoltre possibile istruire Raven attendere che il processo di indicizzazione per garantire che otterrete sempre i risultati più accurati (anche se questo potrebbe non essere una buona idea in quanto rallenta le vostre domande) utilizzando i WaitForNonStaleResults istruzioni:

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

Come si risolve il problema di timeout? Ricevo un errore di timeout quando utilizzo la .waitfornonstaleresults() nella query. – ZVenue

+0

TimeOutException non gestito dal codice utente: {"Attesa per 15,250 ms per la query per restituire risultati non aggiornati."} - è il messaggio. . – ZVenue

+3

Ho usato .... Personalizza (x => x.WaitForNonStaleResults (TimeSpan.FromSeconds (100))) per correggere l'eccezione di timeout. – ZVenue

1

Avendo bisogno di mettere WaitForNonStaleResults in ogni query si sente come un enorme "codice di odore" (per quanto io normalmente odio il termine, mi sembra del tutto appropriato qui).

L'unica vera soluzione che ho trovato finora è:

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

prestazioni soffre di conseguenza, ma penso che un rallentamento delle prestazioni è molto meno di un peccato di poco affidabile se i risultati non addirittura imprecisi.

0

sono disponibili le seguenti opzioni in base alle the official documentation (il più preferibile prima):

  1. Impostazione cut-off point.

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

    Questo farà in modo che si ottiene gli ultimi risultati fino a quel momento (o fino all'ultimo scrittura). E puoi mettere un tappo su di esso (ad esempio 10 secondi), se vuoi sacrificare la freschezza dei risultati per ricevere la risposta più velocemente.

  2. esplicitamente attesa di risultati non stantio WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))

    Ancora, specificando un timeout sarebbe una buona pratica.

  3. convenzioni Impostazione interrogazione di applicare la stessa regola a tutte le richieste

    store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite.