2009-10-07 4 views
3

J'ai activé le cache de requêtes pour l'une de mes requêtes, ça marche bien (le résultat de requête est extrait du cache de requêtes et des entités du cache de second niveau) quand j'exécute un test ou une application console. Toutefois, si j'exécute les mêmes requêtes via un service WCF, le cache n'est jamais atteint.Cache de requête NHibernate et WCF

J'ai également vérifié les journaux dans les deux cas et ils sont pratiquement identiques jusqu'à ce que le cache manque.

est ici le journal de NH montrant la vente du cache:

[25,4244] 16:15:18,237 DEBUG[NHibernate.Cache.StandardQueryCache]: caching query results in region: 'NHibernate.Cache.StandardQueryCache'; sql: <MyQuery>; parameters: <MyParameter>; first row: 0 
[25,4244] 16:15:18,238 DEBUG[NHibernate.Caches.SysCache.SysCache]: adding new data: key=NHibernate-Cache:NHibernate.Cache.StandardQueryCache:sql: <MyQuery>; parameters: <MyParameter> ; first row: [email protected]&value=System.Collections.Generic.List`1[System.Object] 

Voici le journal de NH montrant la miss du cache:

[25,4244] 16:15:29,089 DEBUG[NHibernate.Cache.StandardQueryCache]: checking cached query results in region: 'NHibernate.Cache.StandardQueryCache'; sql: <MyQuery>; parameters: <MyParameter>; first row: 0 
[25,4244] 16:15:29,089 DEBUG[NHibernate.Caches.SysCache.SysCache]: Fetching object 'NHibernate-Cache:NHibernate.Cache.StandardQueryCache:sql: <MyQuery>; parameters: <MyParameter>; first row: [email protected]' from the cache. 
[25,4244] 16:15:29,095 DEBUG[NHibernate.Cache.StandardQueryCache]: query results were not found in cache: sql: <MyQuery>; parameters: <MyParameter>; first row: 0 

Voilà le journal de NH montrant le succès de cache, lorsqu'ils ne sont pas dans un service WCF:

[11,3656] 17:37:48,718 DEBUG[NHibernate.Cache.StandardQueryCache]: checking cached query results in region: 'NHibernate.Cache.StandardQueryCache'; sql: <MyQuery>; parameters: <MyParameter>; first row: 0 
[11,3656] 17:37:48,718 DEBUG[NHibernate.Caches.SysCache.SysCache]: Fetching object 'NHibernate-Cache:NHibernate.Cache.StandardQueryCache:sql: <MyQuery>; parameters: <MyParameter>; first row: [email protected]' from the cache. 
[11,3656] 17:37:48,728 DEBUG[NHibernate.Cache.StandardQueryCache]: Checking query spaces for up-to-dateness <MyTableName> 
[11,3656] 17:37:48,729 DEBUG[NHibernate.Caches.SysCache.SysCache]: Fetching object 'NHibernate-Cache:UpdateTimestampsCache:<MyTableName>@-1403193414' from the cache. 
[11,3656] 17:37:48,729 DEBUG[NHibernate.Cache.StandardQueryCache]: returning cached query results for: sql: <MyQuery>; parameters: <MyParameter>; first row: 0 

Voici le code que j'utilise pour faire la requête:

using (ISession session = SessionFactory.OpenSession()) 
    using (ITransaction transaction = session.BeginTransaction()) 
    { 
     IList<T> entities = session 
      .CreateCriteria(typeof(T)) 
      .SetCacheable(true) 
      .Add(expression) 
      .List<T>(); 
     transaction.Commit(); 
     return entities; 
    } 

Pourquoi le cache n'est-il pas touché?

Répondre

1

Etes-vous sûr de ne pas recréer SessionFactory pour chaque demande? Ou que vous ne faites généralement pas de réinitialisation inutile?

+1

Oui, j'ai une seule usine de session. Je crée cependant de nouvelles sessions, que voulez-vous dire par une réinitialisation inutile? –

Questions connexes