9

Tengo un problema. No se puede encontrar cómo hacer que OutputCache SQLDependency dependa de una fila de la tabla de la base de datos. P. ej. Tengo un controlador con un parámetro.¿Cómo hacer que OutputCache con SqlDependency dependa de una fila en la base de datos para cada solicitud?

ActionResult Index(int? id) 

Y para cada solicitud con el mismo ID que necesito para comprobar tabla1 tabla de base de datos (int id, fecha y hora LAST_UPDATED). Si la fila con id = id y last_updated no ha cambiado.

Uso el servidor sql 2005 o superior.

¿Qué estrategia debo usar?

He intentado utilizar:

[OutputCache(Duration = int.MaxValue, VaryByParam = "id", 
    SqlDependency = "DatabaseName:table1")] 

pero funciona para cambios en la tabla enteros.

+2

¿Cómo terminaste haciendo esto? –

Respuesta

4
[OutputCache (Duration=int.MaxValue VaryByParam=”None” VaryByCustom=”SqlRow”)] 

En su global.asx, debe hacer lo siguiente.

Public override string GetVaryByCustomString(HttpContext context, string arg) 
{ 
    if(arg.ToLower() == “sqlrow”) 
    { 
    using(SqlConnection conn = new SqlConnection(...)) 
    { 
     conn.Open(); 
     var cmd = conn.CreateCommand(); 
     var id = context.QueryString["id"]; 
     cmd.CommandText = "SELECT LastModifiedTime FROM Table WHERE ID = @id"; 
     cmd.Parameters.Add("id", id); 
     return cmd.ExecuteScalar(); 
    } 
    } 
    return base.GetVaryByCustomString(context, arg); 
} 
7

para evitar golpear la base de datos para cada solicitud de página web (generalmente una operación costosa), el almacenamiento en caché de objetos (introducido en .NET 4.0) puede ser utilizado. Esto daría como resultado una publicación rápida de páginas web porque todo se manejaría directamente desde la memoria. Las operaciones de la base de datos ocurrirían solo si los datos realmente cambiaran, o si la memoria caché fue desalojada de la memoria debido a limitaciones de recursos o su configuración de CacheItemPolicy.

La estrategia práctica utilizada en este caso sería la siguiente.

Paso-1. En el método de modelo en el que se está modificando los datos de la fila "id"/añadido/borrado, completar esa operación de base de datos y, a continuación:

Paso-2. Recuperar el objeto de la memoria caché siempre que sea posible, la actualización de la BD sólo si es necesario:

  • Desde su método de acción del controlador, llamar a un método de modelo que devuelve el objeto identificado por el parámetro "id";
  • Dentro de su método de modelo, verifique la caché para esta identificación. Si es nulo, recupere los datos de su base de datos y compile el objeto como lo haría normalmente, y luego almacene el objeto completo en la caché;
  • Desde el método de modelo, devuelva el contenido de la memoria caché (es decir, su objeto específico para esta identificación) de nuevo al método de acción de controlador llamante y luego permita que el método de acción complete y muestre la vista como de costumbre.

(La clase MemoryCache es la implementación concreta de la clase ObjectCache).

Con este enfoque, el método OutputCache en el controlador no necesitaría ser utilizado en absoluto, y las decisiones de almacenamiento en caché de datos se encapsularían completamente dentro del modelo.Tendríamos una separación más clara de las preocupaciones; mucha más eficiencia, mejores tiempos de respuesta y escalabilidad mejorada; y una menor dependencia de costosas operaciones de bases de datos.

+0

No puede detectar la última modificación sin acceder a la base de datos. Su plan solo funciona si la misma aplicación actualiza el objeto. Si la fila se actualizó en un procedimiento almacenado o en una aplicación externa, esto no funciona. ASP.NET ya tiene mejor memoria caché y memoria caché, esta clase se sugiere para aplicaciones que no sean ASP.NET. –

Cuestiones relacionadas