¿Cómo se implementa el almacenamiento en caché en Linq para SQL?


Acabamos de empezar a usar LINQ para SQL en el trabajo para nuestro DAL y realmente no hemos llegado a un estándar para el modelo de almacenamiento en caché. Anteriormente estábamos usando una clase base ' DAL ' que implementaba una propiedad de administrador de caché de la que todas nuestras clases DAL heredaban, pero ahora no tenemos eso. Me pregunto si a alguien se le ocurrió un enfoque 'estándar' para almacenar en caché los resultados de LINQ a SQL.

Estamos trabajando en un entorno web (IIS) si eso marca la diferencia. Sé que esto bien puede terminar siendo una pregunta subjetiva , pero sigo pensando que la información sería valiosa.

EDIT: Para aclarar, no estoy hablando de almacenar en caché un resultado individual, estoy después de más de una solución de arquitectura, como en cómo configurar el almacenamiento en caché para que todos sus métodos de enlace utilizan la misma arquitectura de almacenamiento en caché.

Author: Community, 2008-09-01

6 answers

Una respuesta rápida: Utilice el patrón de repositorio (consulte Diseño impulsado por Dominio de Evans) para obtener sus entidades. Cada repositorio almacenará en caché las cosas que guardará, idealmente permitiendo que cada instancia del repositorio acceda a una caché única (cada subproceso/solicitud instanciará un nuevo repositorio, pero solo puede haber una caché).

La respuesta anterior funciona en una sola máquina. Para poder usar esto en muchas máquinas, use memcached como su solución de almacenamiento en caché. ¡Buena suerte!

 9
Author: Thomas Lundström,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-07 15:45:43

Mi caché de resultados de consulta LINQ es probablemente justo lo que estás buscando.

var q = from c in context.Customers
        where c.City == "London"
        select new { c.Name, c.Phone };

var result = q.Take(10).FromCache();
[1] Pete.
 38
Author: Pete Montgomery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-04-27 13:36:12

Está justo debajo de tus narices:

List<TableItem> myResult = (from t in db.Table select t).ToList();

Ahora, simplemente almacene en caché myResult como habría almacenado en caché los datos devueltos de su antiguo DAL.

 3
Author: Greg Hurlman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-09-01 03:53:12

Encontré este post, que ofrece un método de extensión como un medio para almacenar en caché los objetos LINQ.

He estado golpeando mi cabeza contra la pared para weaks ahora tratando de encontrar una buena solución de almacenamiento en caché para Linq2Sql, y debo admitir que realmente estoy luchando para encontrar una talla única para todos...

El patrón de repositorio tiende a limitar la utilidad de Linq, ya que (sin reimplementar IQueryable) el almacenamiento en caché debe realizarse fuera de la instrucción Linq.

Además, la carga diferida y el seguimiento de objetos son grandes no-nos si vas a almacenar en caché tus objetos, lo que hace que realizar actualizaciones sea algo más complicado.

Cualquier persona que haya logrado resolver este problema en la naturaleza dentro de un proyecto web altamente concurrente, por favor toque y salvar el mundo! :)

 1
Author: Mark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-21 02:07:46

Entiendo que esta es quizás una respuesta un poco tardía... Además, puedes probar el proyecto LinqToCache . Engancha una SqlDepdency en una consulta LINQ arbitraria, si es posible, y proporciona invalidación de caché activa a través de las Notificaciones de consulta del lado del servidor. Las consultas deben ser consultas válidas para notificaciones, consulte Creación de una consulta para Notificación. La mayoría de las consultas de Linq a sql se ajustan a estas restricciones, siempre y cuando las tablas se especifiquen utilizando nombres de dos partes (dbo.Table, no únicamente Table).

 1
Author: Remus Rusanu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-08-02 03:43:46

Vea el método 'GetReferenceData' en la clase' ReferenceData ' en este artículo : http://blog.huagati.com/res/index.php/2008/06/23/application-architecture-part-2-data-access-layer-dynamic-linq/

Utiliza el asp.net caché de página para almacenar en caché los datos recuperados utilizando L2S.

 0
Author: KristoferA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-11 03:39:20