-
Gestion du cache
Hello à tous,
Je viens de migrer un projet sur hibernate, et j'ai un souci avec les caches :
Y a-t-il un moyen d'initialiser le chargement des caches, c'est-à-dire pour certaines entités charger directement toute la table en mémoire ?
Comment se fait le rechargement des caches ? J'ai vu qu'il y avait des méthodes comme "evict" et "evictCollection" qui permettent d'enlever des classes/collections du cache via la factory, mais j'ai vu que ces méthodes sont deprecated, quelle est la bonne manière de faire ?
Merci d'avance pour vos infos !
-
de quel cache tu parle pour commencer? Premier niveau (Session, avec des objets hydratés) ou deuxième niveau (Factory, données déshydratées)?
-
Je parle du cache du second niveau.
Qu'appelles-tu données déshydratées ?
Merci!
-
des données qui ne sont pas objectifié, on est plus proche là qu'un cache base de donnée que d'un cache d'objets ;) Bref c'est ce qui se trouve dans le cache de second niveau. Hibernate appelle l'hydratation, le fait de prendre un objet java, et d'y injecter les données venues du cache ;)
Maintenant que cherche tu a faire exactement avec le cache de second niveau? Pourquoi vouloir le "précharger" avec des données, sachant que
-> hibernante le remplira au fur et à mesure avec les données réellement utilisées
-> les données peuvent être éjectée automatiquement du cache soit pour faire de la place, soit parce qu'un opération HQL effectuée implique qu'on ne peux plus garantir l'exactitude de son contenu.
Tu peux éventuellement faire un (select * from TonEntite) pour forcer hibernante à lire toute une table, mais c'est un peu inutile à mon avis.
-
oki je connaissais pas cette notion :mouarf:
En fait je voulais pouvoir charger les objets des tables que j'utilise tout le temps mais à priori seulement le 1er traitement sera long, ce n'est donc pas très grave.
Par contre il arrive souvent dans l'appli qu'il y ait des batchs externes modifiant les données en base. Comment je pourrais faire pour que les objets du cache de second niveau soient mis à jour ? Je fais un evict sur les entités concernés ?
Merci :aie:
-
Tu peux soit détruite la session factory, soit faire un Cache cache = factory.getCache(); puis d'appeler les différents evict sur ce cache (evictcollections(), evictEntities(), ....)
En général, l'utilisation d'un cache de second niveau n'est pas à utiliser avec des données qui sont régulièrement mise à jour depuis l'extérieur.
-
Ok je vais faire des petits evict alors :?
Maintenant j'ai plus qu'à me lancer dans JBossCache pour faire de la réplication 8-)...
Merci pour ton aide tchize :)