2012-01-03 19 views
6

Al consultar RavenDB me doy cuenta de que no se obtienen los resultados esperados de inmediato. Puede ser que tenga que ver con la indexación, no lo sé.RavenDB - problema de consulta - Resultados obsoletos/índices

Por ejemplo:

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

Cuando ejecuto esto, entonces ACount y BCount obtener sus valores de inmediato en la primera ejecución). Sin embargo, CCount y DCount no obtienen sus valores hasta después de tres o cuatro ejecuciones. Muestran valor 0 (cero) en las primeras carreras.

¿Por qué ocurre esto en la parte inferior dos y no en las dos consultas principales? Si es debido a resultados obsoletos (o índices), ¿cómo puedo modificar mis consultas para obtener resultados precisos todo el tiempo, cuando lo ejecuto la primera vez? Gracias por ayudar.

Respuesta

14

Si no ha definido un índice para la consulta de Películas, Raven creará un Dynamic Index. Si usa la consulta repetidamente, el índice se mantendrá automáticamente. De lo contrario, Raven lo descartará y eso puede explicar por qué estás obteniendo 0 resultados durante las primeras carreras.

También puede indicar cuervo que esperar a que el proceso de indexación para asegurarse de que siempre obtendrá los resultados más precisos (aunque esto podría no ser una buena idea, ya que se ralentizará sus consultas) mediante el uso de las WaitForNonStaleResults instrucciones:

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

¿Cómo soluciono el problema del tiempo de espera? Recibo un error de tiempo de espera cuando estoy utilizando .waitfornonstaleresults() en la consulta. – ZVenue

+0

TimeOutException no administrado por el código de usuario: {"Esperado por 15,250ms para que la consulta devuelva un resultado no obsoleto."} - es el mensaje. . – ZVenue

+3

utilicé ... Personalice (x => x.WaitForNonStaleResults (TimeSpan.FromSeconds (100))) para corregir la excepción de tiempo de espera. – ZVenue

1

Necesidad de poner WaitForNonStaleResults en cada consulta se siente como una masiva "olor código" (todo lo que normalmente odio el término, parece completamente apropiado en este caso).

La única solución real que he encontrado hasta ahora es:

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

rendimiento se resiente en consecuencia, pero creo que un rendimiento más lento es mucho menos de un pecado que no fiable si los resultados no totalmente inexactas.

0

Se tienen las siguientes opciones en función de the official documentation (el más preferible en primer lugar):

  1. ajuste del punto de de corte.

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

    Esto se asegurará de que usted obtenga los últimos resultados hasta ese punto en el tiempo (o hasta que la última escritura). Y puede ponerle un límite (por ejemplo, 10s), si quiere sacrificar la frescura de los resultados para recibir la respuesta más rápido.

  2. explícitamente a la espera de los resultados no rancios WaitForNonStaleResultsAsOfNow(TimeSpan.FromSeconds(10))

    De nuevo, la especificación de un tiempo de espera sería una buena práctica.

  3. convenciones Consulta de Ajuste para aplicar la misma regla a todas las solicitudes

    store.Conventions.DefaultQueryingConsistency = ConsistencyOptions.AlwaysWaitForNonStaleResultsAsOfLastWrite.