Discussion:
[NHibernate-Hispano] Ejecutar stored procedure borra la second level cache
Andrés Falcón
2016-05-11 15:52:56 UTC
Permalink
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
--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernate-***@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-hispano+***@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.
Andrés Falcón
2016-05-12 14:48:46 UTC
Permalink
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.
Post by Andrés Falcón
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
--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernate-***@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-hispano+***@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.
Carlos Peix
2016-05-12 17:49:07 UTC
Permalink
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
Post by Andrés Falcón
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.
Post by Andrés Falcón
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
--
--
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
Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernate-***@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-hispano+***@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.
Andrés Falcón
2016-05-13 13:23:37 UTC
Permalink
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
Post by Carlos Peix
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
Post by Andrés Falcón
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.
Post by Andrés Falcón
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
--
--
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
Para acceder a más opciones, visita https://groups.google.com/d/optout.
--
--
Para escribir al Grupo, hágalo a esta dirección: NHibernate-***@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-hispano+***@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/d/optout.
Loading...