2011-07-26 19 views
7

En mi aplicación he usado Controlador genérico para atender solicitudes.¿Cómo almacenar datatable en caché para reutilizarlo?

Quiero un mecanismo como si la primera solicitud viene al controlador, realiza una solicitud al servidor y luego almacena en caché toda la tabla de datos, por lo que para la próxima solicitud si el siguiente código de producto solicitado está en la tabla de datos del caché, no debería ir al servidor para recuperar datos de nuevo ... solo debe verificar los datos de la tabla de datos.

Entonces, ¿me puede explicar cómo puedo establecer datatable en el caché?

Respuesta

21

algo en este sentido?

public DataTable GetDataTableFromCacheOrDatabase() 
{ 
    DataTable dataTable = HttpContext.Current.Cache["secret key"] as DataTable; 
    if(dataTable == null) 
    { 
     dataTable = GetDataTableFromDatabase(); 
     HttpContext.Current.Cache["secret key"] = dataTable; 
    } 
    return dataTable; 
} 

Necesitará algún mecanismo para purgar la tabla de datos de la memoria caché si cambia. Por ejemplo, podría usar un SqlCacheDependency.

Conforme a lo solicitado, para borrar la caché de una hora después se añade el cuadro que haría:

HttpContext.Current.Cache.Insert("secret key", dataTable, null, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration); 
+2

No es seguro para subprocesos ... ¿Qué ocurre si se elimina la entrada de caché entre 'if' y' return'? –

+0

@Thomas Levesque - Eso es muy poco probable. – JonH

+2

@JonH, las cosas altamente improbables suceden todo el tiempo ... si puede suceder, probablemente lo hará, tarde o temprano (esa es más o menos la idea detrás de la ley de Murphy) –

1

puede utilizar:

HttpContext.Current.Cache["CacheDataTableID"] = datatableInstance; 
4

probar esto

DataTable mytable; 
String key = "key" 
if(HttpContext.Current.Cache[Key] ==null) 
{ 
     mytable = GetDTFromDB(); 
     if(mytable.Rows.Count > 0) 
      HttpContext.Current.Cache.Insert(strKey, mytable, Nothing, DateTime.Now.AddHours(1), System.Web.Caching.Cache.NoSlidingExpiration); 
    else 
     mytable = HttpContext.Current.Cache[strKey]; 
    } 
0

se puede escribir una propiedad para su mesa como

public DataTable CachedTable { get{ 
     if(Cache["CachedTable"] == null) 
    { 
     Cache["CachedTable"]= //get from databse 
     } 
     return Cache["CachedTable"]; 
    } } 
Cuestiones relacionadas