Comunidad para aprender y compartir conocimientos en programación
[ Entrar ] - [ Registrarse ]
1
+  -
*
(1)

Cache en aplicación y NHibernate

Estoy implementando el uso de Cache en YoProgramo.NET para mejorar el rendimiento, hasta el momento lo he logrado bastante bien.

Aquí les muestro un método donde implemento cache de contexto web:

    public IList<IStory> GetAllNotSpam() {
        IList<IStory> AllStoriesNotSpam = (IList<IStory>) HttpContext.Current.Cache.Get("AllStoriesNotSpam");

        if(AllStoriesNotSpam == null)
        {
            AllStoriesNotSpam =  (from s in GetAll()
                                    where !s.HasSpam() && !s.IsLockedOut
                                    orderby s.PostedAt descending
                                    select s).ToList();
            HttpContext.Current.Cache.Insert("AllStoriesNotSpam", AllStoriesNotSpam, null, DateTime.MaxValue, TimeSpan.FromMinutes(2));               
        }
        return AllStoriesNotSpam;
    }

GetAll() trae todos los items del repositorio.

Ahora bien, no hay nada complicado aquí, agrego la colección al cache. Pero me surgen también algunos interrogantes con respecto a NHIbernate y dudo si esto que hago es lo correcto.

No seria mejor implementar cache de segundo nivel de NHIbernate? Y si lo implemento, usar Cache de contexto en la capa de servicios no es redundante?


26 julio 2009
Foto
Fabian
7
0
+  -

En NHibernte, dejo que el mismo maneje el cache, en la configuracion de NHibernate configuro el uso de cache de la siguiente forma:

<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider,NHibernate.Caches.SysCache</property>
<property name="cache.use_second_level_cache">true</property>

Luego a nivel de las queries si tengo una consulta de la siguiente forma:

var products = session.CreateCriteria(typeof(Product))
                    .Add(Restrictions.Eq("Category.Id", categoryId))
                    .List<Product>();

La convierto a:

var products = session.CreateCriteria(typeof(Product))
                    .SetCacheable(true)
                    .Add(Restrictions.Eq("Category.Id", categoryId))
                    .List<Product>();

A nivel de entidad es necesario especificar como es que esta va a ser manejada por el cache, por ejemplo puede ser en modo read-write, para entidades que pueden cambiar o read-only para entidades que rara vez van a cambiar:

<cache usage="read-write"/>

o

<cache usage="read-only"/>

De esa forma de alguna manera me desentiendo del cache y dejo que NHibernate lo gestione por mi.

27 julio 2009
Foto
mario.chavez
0
0
+  -

Perfecto, ya implementé el cache de segundo nivel y funciona perfecto.

Lo que te olvidaste mencionar es que en el config del nhibernate tambien hay que agregar esto:

<property name="cache.use_query_cache">true</property>

En el caso de este sitio, simplemente cambie el metodo GetAll() de mi clase DAOBase por esto:

    public IList<TYpe> GetAll(int pageIndex, int pageSize) {
        ICriteria criteria = session.CreateCriteria(typeof(TYpe));
        criteria
            .SetCacheable(true)
            .SetFirstResult(pageIndex * pageSize);
        if (pageSize > 0) {
            criteria.SetMaxResults(pageSize);
        }
        return criteria.List<TYpe>();
    }

Gracias por la info Mario

27 julio 2009
Foto
Fabian
7

Tu Respuesta

o

YoProgramo.NET es una comunidad para unir y ayudar a los programadores hispanos.

Aquí los desarrolladores pueden encontrar repuesta a sus dudas y colaborar con los demás, compartiendo sus conocimientos y experiencia.

Mensaje

Cerrar ventana