Configuration de la mise en cache

Revenons à nos paramètres de mise en cache dans le fichier hibernate.cfg.xml :

<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.SingletEhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

Faites attention à la première ligne - elle contient le nom de la classe du moteur de mise en cache. Hibernate n'implémente pas réellement la mise en cache en interne, mais fournit un ensemble d'interfaces avec lesquelles vous pouvez implémenter votre propre moteur de mise en cache.

Les implémentations populaires incluent :

  • EHCache
  • OSCache
  • SwarmCache
  • JBoss TreeCache

EHCache

Il peut être mis en cache en mémoire ou sur disque, ainsi que dans la mise en cache du cluster, et prend également en charge un cache facultatif des résultats de requête Hibernate.

OSCache

Prend en charge la mémoire et la mise en cache du disque dans la même JVM avec un riche ensemble de politiques d'expiration et une prise en charge du cache des requêtes.

SwarmCache

Cache de cluster basé sur JGroups. Il utilise l'invalidation en cluster mais ne prend pas en charge le cache de requête Hibernate.

Cache JBoss

Un cache cluster répliqué entièrement transactionnel, également basé sur la bibliothèque de multidiffusion JGroups. Il prend en charge la réplication ou l'invalidation, la communication synchrone ou asynchrone et le verrouillage optimiste et pessimiste. Le cache de requête Hibernate est pris en charge.

Ces moteurs ne prennent pas en charge toutes les stratégies d'accès parallèle. La situation réelle est décrite dans le tableau ci-dessous :

Stratégie/Fournisseur Lecture seulement lecture-écriture non stricte lire écrire transactionnel
EHCache X X X
OSCache X X X
SwarmCache X X
Cache JBoss X X

Exemple de configuration EHCache

Le moteur EHCache possède son propre fichier de configuration appelé ehcache.xml. Le contenu approximatif d'un tel fichier :

<diskStore path="java.io.tmpdir"/>

<defaultCache
    maxElementsInMemory = "1000"
    eternal = "false"
    timeToIdleSeconds = "120"
    timeToLiveSeconds = "120"
    overflowToDisk = "true"
/>

<cache name = "Employee"
    maxElementsInMemory = "500"
    eternal = "true"
    timeToIdleSeconds = "0"
    timeToLiveSeconds = "0"
    overflowToDisk = "false"
/>

Ici, vous pouvez configurer les paramètres de mise en cache à la fois en général et pour chaque entité séparément. En savoir plus dans la documentation officielle .

Analyse des statistiques de mise en cache

Vous devrez peut-être également vérifier la configuration du mécanisme de mise en cache. Hibernate fournit un objet Statistics spécial spécifiquement pour cela.

Exemple:

Statistics statistics = session.getSessionFactory().getStatistics();
CacheRegionStatistics cacheStatistics = statistics.getDomainRegionStatistics(“com.codegym.employee”);

long hitCount = cacheStatistics.getHitCount();
long missCount = cacheStatistics.getMissCount();
double hitRatio = (double) hitCount / (hitCount + missCount);

Nous n'entrerons pas dans les détails à ce sujet, car il faudra encore de nombreuses années avant que vous ne manquiez de solutions de mise en cache standard et que vous deviez les améliorer manuellement. Soit dit en passant, ce commentaire a peut-être été extrait d'un cas similaire :

// Dear programmer:
// When you're done "optimizing" this routine
// and realize how big of a mistake it was to do this,
// please increment the counter at the bottom as a warning
// for the next guy:
// number_of_hours_spent_here = 42