Nous utilisons intensivement la fonctionnalité multi-requêtes de NHibernate et expérimentons un comportement étrange. On dirait que NHibernate ne met pas en cache les multiqueries et qu'il frappe toujours la base de données. Nous utilisons QueryOver, toutes les requêtes sont configurables, mais lors du test de la page d'accueil avec blitz.io avec le modèle -p 1-250:30
, je peux voir que la seule requête multiple qui frappe la base de données est exécutée plus de 2000 fois, alors que d'autres requêtes utilisateur connecté) ne sont exécutés qu'une ou deux fois. Donc, la question est: ai-je oublié quelque chose ou NHibernate ne cache pas vraiment les résultats de plusieurs requêtes?Mise en cache NHibernate de second niveau avec multi-requête
Répondre
Aha, j'ai compris! Comme il s'est avéré, ce n'était pas la faute du cache de second niveau, mais plutôt notre utilisation de QueryOver est à blâmer.
Comme nous écrivons une application SaaS multi-locataires, la plupart de nos requêtes ressemblait à ceci:
return
Session.QueryOver<Article>().Cacheable().
Where(a => a.Site == site && a.PublishedAt <= publishedAt).
OrderByCoalesceDesc(typeof(DateTime), a => a.UpdatedAt, a => a.CreatedAt).
Take(count).
Future();
Et a.Site == site
était le problème. Apparemment, la façon dont le cache de requête vérifie si les résultats de la requête sont mis en cache ou non est essentiellement en utilisant une combinaison d'une instruction SQL et de tous les paramètres comme clé du cache "hashtable". Le texte de l'instruction SQL est toujours le même pour nos multi-requêtes, mais le paramètre site
était le coupable. NH vérifie pour voir si tous les paramètres fournis correspondent à ceux déjà dans le cache et naturellement nous n'avons pas Equals()
implémenté dans notre classe Site
, donc la vérification a toujours échoué.
Ce que nous avons fini avec réécrivait nos requêtes comme ceci:
var siteID = site.ID;
return
Session.QueryOver<Article>().Cacheable().
Where(a => a.Site.ID == siteID && a.PublishedAt <= publishedAt)...
- 1. Cache de second niveau NHibernate avec NHibernate Linq Provider 1.0
- 2. NHibernate: expiration du cache de second niveau
- 3. Nhibernate et SetCacheable avec cache de second niveau
- 4. Glassfish avec mise en cache de second niveau infinispan
- 5. Cache de second niveau NHibernate avec mises à jour externes
- 6. Mise en cache de niveau 2 de NHibernate avec AppFabric
- 7. memcache comme cache de second niveau de Nhibernate
- 8. NHibernate - compteurs avec accès simultané et mise en mémoire cache de second niveau
- 9. Cache de second niveau NHibernate pour la sous-classe uniquement
- 10. Cache-Hibernate cache-id de second niveau
- 11. Problème de performances du cache de second niveau NHibernate
- 12. Configuration de la mise en cache de second niveau NHibernate dans une application MVC
- 13. Différences entre les fournisseurs de cache de second niveau NHibernate
- 14. Supprimer des objets du cache de second niveau NHibernate
- 15. Mise en mémoire cache de second niveau de NHibernate des collections
- 16. Comment effacer le cache de second niveau NHibernate
- 17. Comment effacer l'intégralité du cache de second niveau dans NHibernate
- 18. Invalider manuellement le cache de second niveau NHibernate
- 19. Mise en cache NHibernate fluide avec automapping
- 20. Cache et associations de second niveau Hibernate
- 21. NHibernate deuxième niveau de mise en cache pas retournant l'objet
- 22. Hibernate problèmes de cache de second niveau
- 23. Hibernate Cache de second niveau en cas de suppression logicielle
- 24. Les entités retournées avec ISQLQuery ne sont pas stockées dans le cache de second niveau NHibernate?
- 25. Manipulation du cache de second niveau Hibernate
- 26. Redis comme cache de second niveau Hibernate
- 27. Comment rafraîchir le cache de second niveau?
- 28. Configuration du cache de second niveau d'hibernation
- 29. NHibernate 2e niveau Cache problème avec QueryOver
- 30. Est-ce que quelqu'un utilise Velocity pour la mise en cache de second niveau de NHibernate en production?