Cet article décrit la technologie de mise en cache dans le cadre Hibernate. Partagez-le pour votre référence, comme suit:
Le cache du cadre Hibernate est divisé en cache de session et cache SessionFactory, également connu sous le nom de cache de niveau 1 et de cache de niveau 2.
Cache de niveau 1:
Le cache de niveau 1 est un cache au niveau de la session, qui a un cycle de vie court, correspond à la session, est géré par Hibernate et est un cache à l'échelle des transactions. Lorsque le programme appelle la méthode Session Load (), méthode get (), la méthode Save (), la méthode SaveorUpDate (), la méthode Update () ou la méthode d'interface de requête, HiberNate mettra en cache l'objet entité; Lorsque l'objet entité est interrogé via la méthode Load () ou la méthode GET (), Hibernate sera d'abord interrogé dans le cache. Ce n'est que lorsque l'objet entité ne peut être trouvé que HiberNate publiera des instructions SQL à interroger dans la base de données, améliorant ainsi l'efficacité de l'utilisation d'Hibernate.
Par exemple:
package com.xqh.util; import org.hibernate.session; import com.xqh.model.user; public class test {public static void main (string [] args) {session session = null; try {session = hibernateutil.getSession (); // Obtenez SessionSion.BeginTransaction (); // Activer les transactions System.out.println ("Première requête:"); User user = (user) session.get (user.class, new Integer (1)); System.out.println ("username:" + user.getName ()); System.out.println ("Second Query:"); utilisateur user1 = (user) session.get (user.class, 1); System.out.println ("username:" + "+ user1.getName ()); session.getTransaction (). commit ();} catch (exception e) {e.printStackTrace (); // une erreur rendra la session de transaction Session.getTransaction (). Rollback ();} enfin {// clôture l'objet de session HiberNateUtil.closeSESE (session);}}}Lorsque le programme vérifie pour la première fois l'objet utilisateur via la méthode get (), Hibernate publiera une instruction SQL à la question. À l'heure actuelle, Hibernate effectue un cache de premier niveau sur son objet utilisateur; Lorsque vous interrogez à nouveau via la méthode get (), Hibernate n'émettra pas une instruction SQL car le nom d'utilisateur existe déjà dans le cache de premier niveau. Résultats du programme en cours d'exécution:
Première requête: HiberNate: selectUser0_.id as id0_0_, user0_.name as name0_0_, user0_.sex as sex0_0_ fromtb_user_info user0_ whereser0_.id =? Username: xqhserond Query: username: xqh
Remarque: Le cycle de vie du cache de premier niveau correspond à la session, et il n'est pas partagé entre les sessions. Dans différentes sessions, les objets d'entité mis en cache dans d'autres séances ne peuvent pas être obtenus.
Cache de niveau 2:
Le cache de deuxième niveau est un cache de niveau SessionFactory, et son cycle de vie est cohérent avec SessionFactory. Le cache secondaire peut être partagé entre plusieurs sessions et est un cache à l'échelle du processus ou à l'échelle de l'amas.
Le cache de niveau 2 est un plug-in de cache enfichable, et son utilisation nécessite le support de produits de cache tiers. Dans le cadre Hibernate, la stratégie d'utilisation du cache secondaire est configurée via le fichier de configuration Hibernate.
1. Ajouter un fichier de configuration de cache ehcache.xml
<ehcache> <! - Définit le chemin d'accès au répertoire où les fichiers cache .data sont créés. path = "java.io.tmpdir" /> <! - Configuration du cache par défaut. Ceux-ci seront appliqués aux caches créées par programmation via le CacheManager. S'il est éternel, les délais d'expiration sont ignorés et les Elementis n'ont jamais expiré. Est uniquement utilisé si l'élément n'est pas éternel. Le temps inactif est maintenant - le dernier accession à TimeTimetoliveSeconds - définit le temps de vivre pour un élément avant son expiration. Est uniquement utilisé si l'élément n'est pas éternel. TTL est maintenant - Création TimeOverflowTodisk - Définit si les éléments peuvent déborder sur le disque lorsque les caches en mémoire ont atteint la limite maxinMemory .--> <DefaultCacheMaMaSelementsInMemory = "10000" eternal = "false" TimetoidleSeconds = "120" TIMETOLIveSECDS = "120" caches. Ajoutez vos paramètres de configuration de cache ici. Si vous n'avez pas de configuration pour votre cache, un avertissement sera émis lorsque TheCacheManager démarre les attributs suivants sont requis pour DefaultCache: Nom - Définit le nom du cache. Ceci est utilisé pour identifier le cache. Il doit être unique.MaxInMemory - Définit le nombre maximum d'objets qui seront créés dans MemoryEtternal - Définit si les éléments sont éternels. S'il est éternel, les délais d'expiration sont ignorés et les Elementis n'ont jamais expiré. Est uniquement utilisé si l'élément n'est pas éternel. Le temps inactif est maintenant - le dernier accession à TimeTimetoliveSeconds - définit le temps de vivre pour un élément avant son expiration. Est uniquement utilisé si l'élément n'est pas éternel. TTL est maintenant - Création TimeOverflowTodisk - Définit si les éléments peuvent déborder sur le disque lorsque les caches en mémoire ont atteint la limite maxinmemory .--> <! - Cache d'échantillon nommé sampleCache1Ce cache contient un maximum dans la mémoire de 10000 éléments, et expirera l'élément s'il est plus ralenti pour plus de 5 minutes et des vies pour plus de 10 minutes. débordez à TheDisk Cache, qui dans cette configuration ira partout où Java.io.tmp est défini sur votre système. Sur un système Linux standard, ce sera / tmp "-> <cache name =" sampleCache1 "maxElementsInMemory =" 10000 "eternal =" false "TimeToidleSeconds =" 300 "TimetoliveSeconds =" 600 "overflowtodisk =" true "/> <! Ils ne sont pas expirés.
2. Définissez le fichier de configuration Hibernate.
<! - Activer le niveau 2 cache -> <propriété name = "hibernate.cache.use_second_level_cache"> true </ propriété> <! - Spécifiez le fournisseur de produits de cache -> <propriété name = "hibernate.cache.provider_class"> org.hibernate.cache.ehcacheprovider </ / Property> <! - Spécifiez l'objet en entrée pour niveler 2 Cache ---> <class-cache usage = "read only"> </ class-cache>
exemple:
package com.xqh.util; import org.hibernate.session; import com.xqh.model.user; public class test {public static void main (String [] args) {session session = null; // First SessionTry {session = hibernateutil.getSession (); session.begintransaction (); System.out.println ("First Query:"); User user = (user) session.get (user.class, 1); System.Out.println ("nom de l'utilisateur:" + user.getName ()); session.getTransaction (). gens // activer le deuxième cache session.begintransaction (); system.out.println ("deuxième requête:"); utilisateur user = (user) session.get (user.class, 1); System.out.println ("username:" + user.getName ())) transaction session.getTransaction (). Rollback ();} Enfin {// Fermez l'objet de session hibernateutil.closeSession (session);}}}Le cache secondaire est partagé entre les sessions, de sorte que le même objet peut être chargé dans différentes sessions. Hibernate ne publiera qu'une instruction SQL. Lorsque l'objet est chargé la deuxième fois, Hibernate obtiendra cet objet à partir du cache.
Résultats du programme:
Première requête: HiberNate: selectUser0_.id as id0_0_, user0_.name as name0_0_, user0_.sex as sex0_0_ fromtb_user_info user0_ whereser0_.id =? Username: xqhserond Query: username: xqh
Pour le cache L2, certaines données rarement mises à jour ou des données référencées peuvent être utilisées, et ses performances seront considérablement améliorées pour le moment. Cependant, si les données fréquemment modifiées sont utilisées pour le cache L2, les performances causeront certains problèmes.
J'espère que la description de cet article sera utile à la programmation Java de chacun basée sur le cadre d'hibernate.