Estoy desarrollando una aplicación web y me gustaría que el almacenamiento en caché persista en todas las solicitudes web. Soy consciente de que la memoria caché de primer nivel es solo por sesión. Tengo el caché de segundo nivel habilitado y esto funciona para las consultas.Entidades de almacenamiento en caché NHibernate en todas las sesiones usando SysCache
Sin embargo, el caché de segundo nivel no parece funcionar para entidades "get" ... por lo tanto, la mayor parte del trabajo DB que hace la aplicación no se almacena en caché en las solicitudes web.
¿Este comportamiento es normal/deseable? Estoy revisando una página en particular que hace muchos viajes redondos a la base de datos, aunque cada consulta es rápida, estos parecen innecesarios si las entidades pueden ser almacenadas en caché.
Edición
Bueno por lo que tengo activado caché de segundo nivel, y trabajando para las consultas. Parece que no puedo hacer que funcione para las entidades. Tengo Cache.Is(c => c.ReadWrite())
(nhibernate fluido) en mi entidad principal que estoy probando. Pero no, todavía golpea el DB cada vez. ¿Algunas ideas?
Edición
He intentado usar las transacciones de este modo:
public override Accommodation Get(int id)
{
using (var tx = Session.BeginTransaction())
{
var accomm = Session.Get<Accommodation>(id);
tx.Commit();
return accomm;
}
}
Mi asignación es tal (y se puede ver que tenemos un esquema desagradable):
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());
}
Sin embargo, esto todavía no parece obtenerse de la memoria caché de segundo nivel.
Por cierto, veo un montón de ejemplos en línea usando Cache.ReadWrite()
pero sólo puede ver un método Is
en el ayudante de caché, por lo que estoy tratando Cache.Is(c => c.ReadWrite())
- ha cambiado la interfaz fluida?
La manera más fácil sería grabará la sesión de NHibernate en el interior de una sesión web, pero no estoy recomendando esto: P Probablemente debería arreglar su segundo nivel de almacenamiento en caché - tiene usted lee este post: http: // blogs.hibernatingrhinos.com/nhibernate/archive/2008/11/09/first-and-second-level-caching-in-nhibernate.aspx? – rsenna
+1 para el enlace, pero vea mi edición –
code + mapping? – Paco