NHibernate - Configurer le cache level 2

Le cache level 2 permet d'optimiser les performances au niveau du requêtage NHibernate.

Contrairement au cache propre à une session Nhibernate d'un utilisateur, le cache level 2 cache les objets (entités et leurs collections) au niveau de la session factory, commune à tous les utilisateurs.

Lorsqu'un objet est caché, et qu'on le demande à nouveau, Nhibernate va vérifier :
le contenu du cache de la session, puis le contenu du cache level 2 si le mécanisme est activé.

Si l'objet n'est pas caché, Nhibernate effectue alors une requête SQL pour le récupérer (requête visible en activant les traces de la classe Nhibernate.SQL avec log4net si vous souhaitez debugger : ici).

Attention, l'activation du cache level 2 peut parfois avoir un effet inverse sur les performances. Activez le, si vous savez vraiment ce que vous faites.

Il existe plusieurs librairies récupérables sur le net, permettant de mettre en place le système de cache level 2 sous Nhibernate.

Commencez par télécharger ces librairies ici.

Cet article a pour but de vous présenter comment on configure le cache level 2 avec la librairie "NHibernate.Caches.SysCache".
Dans ce cas, n'oubliez pas de référencer dans votre projet (projet couche DAO en l'occurence) la dll NHibernate.Caches.SysCache.dll.


Dans le Web.config de l'application, déclarer une section nommée "syscache" au niveau des <configsections> :

<configSections>
   ...
  <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate"/>

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

On ajoute ensuite la section syscache :


<syscache>
  <cache region="longCache" expiration="3600" priority="5" />
  <cache region="shortCache" expiration="360" priority="3" />
</syscache>

Ci-dessus, on a déclaré deux régions de cache définissant la durée durant laquelle les objets vont rester en cache.

Dans la section <hibernate-configuration>, ajoutez les propriétés suivantes :


<hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
  <session-factory>

    ...

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

    ...

 </session-factory>
</hibernate-configuration>

cache.use_second_level_cache : indique que le cache level 2 est activé.
cache.provider_class : fourni la classe implémentant le système de cache level 2.

Exemple d'utilisation du cache sur un model object "Employee" :

On utilise le cache level 2 pour cacher les entités NHibernate ou encore les collections, la configuration se fait alors au niveau des fichiers de mapping hbm.xml :

<class name="Employee" table="Employees">

  <cache usage="read-only" region="shortCache"/>   
  <id name="EmployeeID" type="Int32">
    <generator class="native" />
  </id>

  <property name="LastName" type="String" />
  <property name="FirstName" type="String" />
  <property name="Title" type="String" />
  <property name="TitleOfCourtesy" type="String" />
  <property name="BirthDate" type="DateTime" />
  <property name="HireDate" type="DateTime" />
  <property name="Address" type="String" />
  <property name="City" type="String" />
  <property name="Region" type="String" />
  <property name="PostalCode" type="String" />
  <property name="Country" type="String" />
  <property name="HomePhone" type="String" />
  <property name="Extension" type="String" />

  <set name="Orders">
    <cache usage="read-only" region="longCache"/>
    <key column="EmployeeID"/>
    <one-to-many class="Order"/>
  </set>

</class>

La configuration ci-dessus indique que l'on va utiliser la région "shortCache" pour les entités Employee et la région "longCache" pour sa collection Orders.
Ainsi les entités Employee qui seront requêtées via Nhibernate, resteront moins longtemps dans le cache level 2 que les collections Orders.

Pour plus de détails sur les options du cache, n'hésitez pas à jeter un oeil sur la documentation officielle.

0 commentaires:

Enregistrer un commentaire