2010-10-17 5 views
3

Avec cela, je peux dire Fluent NHibernate utiliser SysCache comme 2e niveau fournisseur de cache:Comment configurer SysCache sur NHibernate Fluent?

MsSqlConfiguration.MsSql2008.ShowSql().ConnectionString(x => 
      { 
       x.Server(@"localhost\ANDREPC"); 
       x.Database("mydb"); 
       x.TrustedConnection(); 
      }).Cache(c => c.ProviderClass<SysCacheProvider>().UseQueryCache()) 

Par ailleurs, les configurations de SysCache doivent être placés sur web.config:

<configuration> 
<configSections> 
    <section name="syscache" type="NHibernate.Caches.SysCache.SysCacheSectionHandler,NHibernate.Caches.SysCache" /> 
</configSections> 

<syscache> 
    <cache region="foo" expiration="500" priority="4" /> 
    <cache region="bar" expiration="300" priority="3" /> 
</syscache> 
</configuration> 

Et maintenant? Que signifient ces régions? Comment associer une région à un type? Comment puis-je faire cela pour travailler? Mes tests de jMeter montrent que, après la configuration au-dessus de mon application, il y avait 7% plus lent qu'avant. J'ai besoin de comprendre SysCache et d'apprendre comment continuer avec la configuration.

Merci.

PS: La documentation officielle est SysCache here et il n'explicatif

Répondre

3

En fonction de ce que vous faites, par défaut, je pense que le cache L2 est uniquement les éléments en cache appelés par ID, PAR EXEMPLE session.Get ou session.Load. Pour mettre en cache des requêtes à l'aide d'ICriteria etc, vous devez spécifiquement dire que vous voulez que cette requête soit mise en cache. PAR EXEMPLE.

ICriteria criteria = Session.CreateCriteria().SetCacheable(true).SetCacheRegion("SomeNameHere"); 

Le nom ici est votre région de cache. En bref, cela groupe les éléments du cache, en gardant cela vraiment breif. Je ne fais que mettre le nom de la classe/entité comme "Person" ou "Company". Lorsque vous configurez vos class maps, vous pouvez toujours vouloir jouer avec la propriété Cache de la classe de base. Ses quelque chose comme

Cache.ReadWrite().IncludeAll() ; 

Personnellement, je trouve que, sans cela, lorsqu'une requête a été exécutée il mis en mémoire cache les ID de chaque élément dans l'ensemble de résultats, mais pas les articles eux-mêmes, donc ce serait une question lourde rapide, mais il doit frapper la base de données pour chaque élément, donc si vous avez une requête très simple renvoyant 100 éléments, votre base de données pourrait alors être frappée 100 fois. J'ai trouvé que l'ajout de ce qui précède à ma classe de cartographie résolu ce problème.

Espérons que cela aide.