Je développe une application web et je voudrais que la mise en cache persiste à travers les requêtes web. Je suis conscient que le cache de premier niveau est uniquement par session. J'ai la mise en cache de second niveau activée et cela fonctionne pour les requêtes. Cependant, le cache de second niveau ne semble pas fonctionner pour "obtenir" des entités ... donc la plupart du travail de la base de données que l'application fait n'est pas mis en cache à travers les requêtes Web.NHibernate cache des entités à travers des sessions en utilisant SysCache
Est-ce un comportement normal/souhaitable? J'examine une page particulière qui fait beaucoup d'allers-retours à la base de données, bien que chaque requête soit rapide, cela ne semble pas nécessaire si les entités peuvent être mises en cache.
Modifier
Bon alors je cache de second niveau activé, et le travail pour les requêtes. Je n'arrive juste pas à le faire fonctionner pour les entités. J'ai Cache.Is(c => c.ReadWrite())
(fluent nhibernate) sur mon entité principale que je suis en train de tester. Mais non, il frappe toujours la DB à chaque fois. Des idées?
Modifier
J'ai essayé d'utiliser des transactions comme ceci:
public override Accommodation Get(int id)
{
using (var tx = Session.BeginTransaction())
{
var accomm = Session.Get<Accommodation>(id);
tx.Commit();
return accomm;
}
}
Ma cartographie est telle (et vous pouvez voir que nous avons un schéma méchant):
public void Override(AutoMapping<Core.Entities.Itinerary.Accommodation.Accommodation> mapping)
{
mapping.HasManyToMany(x => x.Features).Table("AccommodationLinkFeatureType").ChildKeyColumn("FeatureTypeId").NotFound.Ignore();
mapping.HasManyToMany(x => x.SimilarAccommodation).Table("AccommodationLinkSimilarAccommodation").ChildKeyColumn("SimilarAccommodationId").NotFound.Ignore();
mapping.HasMany(x => x.TourItinerary).Table("AccommodationTourItinerary");
mapping.HasOne(x => x.Images).ForeignKey("AccommodationId").Cascade.All().Not.LazyLoad();
mapping.References(x => x.CollectionType).NotFound.Ignore().Not.LazyLoad();
mapping.References(x => x.AccommodationUnitType).NotFound.Ignore().Not.LazyLoad();
Cache.Is(c => c.ReadWrite());
}
Cependant, cela ne semble toujours pas aller chercher dans le cache de second niveau.
Soit dit en passant, je vois beaucoup d'exemples en ligne en Cache.ReadWrite()
, mais je ne peux voir une méthode Is
sur l'aide du cache, donc je suis en train Cache.Is(c => c.ReadWrite())
- a l'interface fluide changé?
La meilleure façon économiserions votre session NHibernate à l'intérieur d'une session web, mais je ne recommande pas ceci: P Vous devriez probablement fixer votre mise en cache de niveau 2 - avez-vous lu ce post: http: // blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/09/first-and-second-level-caching-in-nhibernate.aspx? – rsenna
+1 pour le lien, mais voir mon édition –
code + mappage? – Paco