A chaque fois que vous passez un objet à la méthode save()
, update()
ou saveOrUpdate()
et à chaque fois que vous récupérez un objet avec load()
, get()
, list()
, iterate()
or scroll()
, cet objet est ajouté au cache interne de la Session
.
Lorsqu'il y a un appel à la méthode flush()
, l'état de cet objet va être synchronisé avec la base de données. Si vous ne voulez pas que cette synchronisation ait lieu
ou si vous traitez un grand nombre d'objets et que vous avez besoin de gérer la mémoire de manière efficace, vous pouvez utiliser
la méthode evict()
pour supprimer l'objet et ses collections dépendantes du cache de la session
ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set while ( cats.next() ) { Cat cat = (Cat) cats.get(0); doSomethingWithACat(cat); sess.evict(cat); }
La Session
dispose aussi de la méthode contains()
pour déterminer si une instance appartient au cache de la session.
Pour retirer tous les objets du cache session, appelez Session.clear()
Pour le cache de second niveau, il existe des méthodes définies dans SessionFactory
pour retirer des instances du cache, la classe entière, une instance de collection ou le rôle entier d'une collection.
sessionFactory.evict(Cat.class, catId); //evict a particular Cat sessionFactory.evict(Cat.class); //evict all Cats sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections
Le CacheMode
contrôle comme une session particulière interragit avec le cache de second niveau
CacheMode.NORMAL
- lit et écrit les items dans le cache de second niveau
CacheMode.GET
- lit les items dans le cache de second niveau mais ne les écrit pas sauf dans le cache d'une mise à jour d'une donnée
CacheMode.PUT
- écrit les items dans le cache de second niveau mais ne les lit pas dans le cache de second niveau
CacheMode.REFRESH
- écrit les items dans le cache de second niveau mais ne les lit pas dans le cache de second niveau, outrepasse l'effet dehibernate.cache.use_minimal_puts
, en forçant un rafraîchissement du cache de second niveau pour chaque item lu dans la base
Pour parcourir le contenu du cache de second niveau ou la région du cache dédiée au requêtes, vous pouvez utiliser l'API Statistics
API:
Map cacheEntries = sessionFactory.getStatistics() .getSecondLevelCacheStatistics(regionName) .getEntries();
Vous devez pour cela activer les statistiques et optionnellement forcer Hibernate à conserver les entrées dans le cache sous un format plus compréhensible pour l'utilisateur :
hibernate.generate_statistics true hibernate.cache.use_structured_entries true