2010-10-13 10 views
8

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?

+1

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

+0

+1 para el enlace, pero vea mi edición –

+0

code + mapping? – Paco

Respuesta

4

No he probado esto, pero mi entendimiento es que la realización de transacciones es la magia que coloca los objetos en el caché de segundo nivel. Si está realizando operaciones de lectura fuera de una transacción, los objetos no se colocarán en la memoria caché de segundo nivel.

+0

Gracias, yo acababa de descubrir esto también. Ver http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions –

+0

En realidad, esto no pareció solucionar el problema. Ver editar. –

0

Tuve el mismo problema. En mi caso, la causa fue que las referencias se asignaron con NotFound(). Ignorar() (es decir, si no se encuentra ninguna entidad con esta clave externa, ignórela, que de todos modos es un error de coherencia de datos). Elimina NotFound.Ignore y arregla tu db.

+0

Todo cuando sea bueno, a menos que trabaje con una base de datos heredada sobre la cual no tiene control completo de los datos. –

0

Quizás tenga algún problema con la configuración de su proveedor de caché. He sido capaz de hacer lo que desea utilizar Couchbase como proveedor de memoria caché de segundo nivel, como se describe aquí:

http://blog.couchbase.com/introducing-nhibernate-couchbase-2nd-level-cache-provider

Si su entorno de despliegue está en Azure, supongo que esto podría ser útil. Tenga en cuenta que el módulo SysCache no puede coexistir con el módulo AzureMemcached.

http://www.webmoco.com/webmoco-development-blog/orchard-cms-second-level-caching

Cuestiones relacionadas