33 votes

Comment implémenter la mise en cache dans Linq to SQL ?

Nous venons de commencer à utiliser LINQ to SQL au travail pour notre DAL et nous n'avons pas vraiment trouvé de norme pour notre modèle de mise en cache. Auparavant, nous utilisions une classe de base "DAL" qui implémentait une propriété de gestionnaire de cache dont toutes nos classes DAL héritaient, mais maintenant nous n'avons plus cela. Je me demande si quelqu'un a trouvé une approche "standard" pour la mise en cache des résultats LINQ to SQL ?

Nous travaillons dans un environnement web (IIS), si cela peut faire une différence. Je sais que cela peut finir par être un subjectif mais je pense toujours que l'information serait précieuse.

EDIT : Pour clarifier, je ne parle pas de la mise en cache d'un résultat individuel, je cherche plutôt une solution d'architecture, c'est-à-dire comment configurer la mise en cache pour que toutes vos méthodes de liens utilisent la même architecture de mise en cache.

38voto

Pete Montgomery Points 1755

Mon Cache de résultats de requêtes LINQ est probablement ce que vous recherchez.

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

var result = q.Take(10).FromCache();

Pete.

9voto

Thomas Lundström Points 1019

Une réponse rapide : Utilisez le modèle de référentiel (voir Domain Driven Design by Evans) pour récupérer vos entités. Chaque référentiel mettra en cache les éléments qu'il contiendra, idéalement en permettant à chaque instance du référentiel d'accéder à un cache singleton (chaque thread/requête instanciera un nouveau référentiel mais il ne peut y avoir qu'un seul cache).

La réponse ci-dessus ne fonctionne que sur une seule machine. Pour pouvoir l'utiliser sur plusieurs machines, utilisez memcached comme solution de mise en cache. Bonne chance !

4voto

Greg Hurlman Points 10944

C'est juste sous votre nez :

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

Maintenant, il suffit de mettre en cache myResult comme vous l'auriez fait pour les données renvoyées par votre ancien DAL.

1voto

Mark Points 5924

J'ai trouvé ce poste qui propose une méthode d'extension pour mettre en cache les objets LINQ.

Cela fait maintenant plusieurs semaines que je me tape la tête contre le mur en essayant de trouver une bonne solution de cache pour Linq2SQL, et je dois admettre que j'ai vraiment du mal à trouver une solution unique...

Le modèle de dépôt tend à limiter l'utilité de Linq, puisque (sans réimplémenter IQueryable) la mise en cache doit être effectuée en dehors de la déclaration Linq.

En outre, le chargement différé et le suivi des objets sont tous deux à proscrire si vous souhaitez mettre vos objets en cache, ce qui rend les mises à jour plus délicates.

Si quelqu'un a réussi à résoudre ce problème dans la nature au sein d'un projet web hautement concurrent, merci de nous faire part de vos commentaires et de sauver le monde ! :)

1voto

Remus Rusanu Points 159382

Je comprends que cette réponse est peut-être un peu tardive... Quoi qu'il en soit, vous pouvez essayer l'option LinqToCache projet. Il accroche un SqlDepdency à une requête LINQ arbitraire, si possible, et fournit une invalidation active du cache via les notifications de requête côté serveur. Les requêtes doivent être des requêtes valides pour les notifications, voir Création d'une requête pour la notification . La plupart des requêtes Linq-to-sql sont conformes à ces restrictions, à condition que les tables soient spécifiées à l'aide de noms en deux parties ( dbo.Table non seulement Table ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X