Ejecutar stored procedure borra la second level cache

17 views
Skip to first unread message

Andrés Falcón

unread,
May 11, 2016, 11:52:56 AM5/11/16
to NHibernate-Hispano
Buenos día grupo, acudo a uds a ver si me ayudan a solucionar un problema que tengo hace unos días.

Quisiera saber si es normal el comportamiento de siempre borrar la Caché antes de ejecutar un stored procedure con GetNamedQuery. Me está sucediendo que antes de que NHibernate ejecute el stored procedure hace un Evict de los datos y las collections que tengo en la cache.

Segun pude analizar con el código fuente, el tema está en la clase NativeSqlQueryPlan (método CoordinateSharedCacheCleanup) crea un objeto de tipo  BulkOperationCleanupAction y es ahí donde veo que agrega estas clases de la cache

Intenté poner Cacheable(false) para la ejecución del SP y no pasó nada.

Paso mi configuración de la caché para ver si estoy cometiendo un error o me faltó configurar algo mas, dado que es la primera vez que utilizo Cache

configuration.Cache(delegate(ICacheConfigurationProperties properties)
{
   properties.Provider<NHibernate.Cache.HashtableCacheProvider>();
   properties.UseQueryCache = true;
});

configuration.EntityCache<FieldType>(
   entityCacheconfig => {entityCacheconfig.Strategy = EntityCacheUsage.ReadWrite; }
);
configuration.EntityCache<FieldValue>(
   entityCacheconfig => { entityCacheconfig.Strategy = EntityCacheUsage.ReadWrite; }
);

Estoy usando nh 3.4.0.4000

Gracias!

Andrés Falcón

Andrés Falcón

unread,
May 12, 2016, 10:48:47 AM5/12/16
to NHibernate-Hispano
Publico la solución para quien pueda llegar a tener este mismo problema.

Después de investigar un poco más, encontré que nhibernate cuando ejecuta un stored procedure, por default, realiza un invalidate (evict) de las entidades y colecciones de la second level cache (lo pueden ver en el código fuente que detallaba arriba). Ahora bien, si en el tag sql-query agregamos <synchronize table=""> se evita este comportamiento indeseado; es decir, tiene que estar la etiqueta "synchronize" con table="", si no existe, por default "sincroniza" todas las tablas (una feature??, tal vez...)

<sql-query ....>
   ....
   <synchronize table=""/>
   ...
</sql-query>

Esta info la encontré al final de este post https://www.link-intersystems.com/blog/2011/10/08/impact-of-native-sql-queries-on-hibernates-second-level-cache/

gracias de todos modos.

Andrés Falcón.

Carlos Peix

unread,
May 12, 2016, 1:49:28 PM5/12/16
to nhibernate-hispano
Hola Andrés,

No necesariamente es indeseado ese comportamiento.

NH decide invalidar los caches de nivel 1 o la Session porque ese SP podría modificar la información en la base de datos haciendo, potencialmente, inválidos los datos en memoria.

Si vos estás seguro de que el SP es de lectura y no modifica datos, entonces esta OK desactivarlo.

----------------------------------
Carlos Peix

--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernat...@googlegroups.com
Para más, visite: http://groups.google.com/group/NHibernate-Hispano
---
Has recibido este mensaje porque estás suscrito al grupo "NHibernate-Hispano" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hisp...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Andrés Falcón

unread,
May 13, 2016, 9:23:38 AM5/13/16
to NHibernate-Hispano
Gracias Carlos

Si, totalmente de acuerdo que no es "indeseado" que el SP puede llegar a tocar algo y sería necesario invalidarlo. Lo que me parece, que no se si está bien es que "por default", si no existe el tag "invalide todo" y si lo agregás vacío, no invalida. Entiendo que es una decisión de diseño y puede que por ahi no vea si está bien o no, porque recién empiezo a usar la Caché. Pero que el nombre del campo se llame "synchronize", me da la impresión que si no está, no debería sincronizar.

Saludos.

Andrés Falcón

----------------------------------
Carlos Peix

Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a nhibernate-hispano+unsub...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages