1. Introduction au cache mybatis
Tout comme la plupart des cadres de couche de persistance, MyBatis fournit également un support pour les caches L1 et L2.
1. Cache de niveau 1:
Le cache local Hashmap basé sur PerpetualCache a une portée de stockage de session. Une fois la session à chasse d'eau ou de fermeture, tous les caches de la session seront effacées.
2. Cache de niveau 2:
Le cache de deuxième niveau est le même que le cache de premier niveau, et la valeur par défaut est PerpetualCache et HashMap Storage. La différence est que sa portée de stockage est le mappeur (espace de noms), et il peut personnaliser la source de stockage, comme ehcache.
3. Pour le mécanisme de mise à jour des données de cache , lorsqu'une certaine portée (Session de cache de premier niveau / espaces de noms de cache de deuxième niveau) est effectué, tous les caches de sélections sous cette portée seront effacés par défaut.
1.1. Test de cache MyBatis niveau 1
Package me.gacl.test; import me.gacl.domain.user; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.sqlSession; import org.junit.test; / *** @author gacl * test 1 cache de la série * (On par défaut) * / @ TestPublic void testCache () {sqlSession session = mybatisUtil.getsqlSession (); String Statement = "me.gacl.mapping.usermapper.getuser"; user user = session.selectone (instruction,); System.out.println (utilisateur); / ** premier niveau de niveau au niveau ); System.out.println (utilisateur); session.close (); / *. Ce doit être la même session. Si l'objet de session a été fermé (), il est impossible de l'utiliser * / session = mybatisUtil.getsqlSession (); user = session.selectone (instruction,); System.out.println (utilisateur); / *. Les conditions de requête sont les mêmes * / user = session.selectone (instruction,); System.out.println (utilisateur); / *. No Session.ClearCache () a été exécuté pour nettoyer le cache * /// session.clearcache (); user = session.selectone (instruction,); System.out.println (utilisateur); / *. Aucune opération ADD / DELETE n'a été exécutée (ces opérations nettoieront le cache) * / session.update ("me.gacl.mapping.usermapper.updateuser", nouvel utilisateur ("utilisateur",)); user = session.selectone (instruction,); System.out.println (user);}} 1.2. Test de cache MyBatis niveau 2
1. Allumez le cache secondaire et ajoutez la configuration suivante au fichier userMapper.xml
<mapper namespace = "me.gacl.mapping.usermapper"> <! - Allumez le cache de niveau 2 -> <cache />
2. Testez le cache secondaire
Package me.gacl.test; import me.gacl.domain.user; import me.gacl.util.mybatisutil; import org.apache.ibatis.session.sqlSession; import org.apache.ibatis.session.sqlSessionFactory; Import Org.Junit.Test; / *** @Author Gacl * Test Niveau 2 Cache * TestTwolevelCache {/ ** Test Level 2 Cache * Utilisez deux objets SQLSession différents pour exécuter des requêtes avec les mêmes conditions de requête. Les instructions SQL ne seront pas envoyées pendant la deuxième requête, mais les données sont directement récupérées à partir du cache * / @ testpublic void testCache () {String Statement = "me.gacl.mapping.usermapper.getuser"; SqlSessionFactory Factory = MybatisUtil.getSQLSessionFactory () factory.opencession (); sqlSession session = factory.opencession (); // Lorsque vous utilisez un cache secondaire, la classe d'utilisateurs doit implémenter une interface de série ===> implémente SerializableUser user = session.selectone (instruction); session.Commit (); // Je ne comprends pas pourquoi, cet endroit doit être soumis après la transaction qui est soumis avant que le deuxième niveau ne travaille le cache secondaire System.out.println ("user =" + utilisateur); // Parce que deux objets SQLSession différents sont utilisés, même si les conditions de requête sont les mêmes, le premier cache de niveau ne sera pas activé. user = session.Selectone (instruction,); // session.commit (); System.out.println ("user =" + user);}} 1.3. Instructions supplémentaires pour le cache secondaire
1. Toutes les instructions de sélection dans le fichier de l'instruction de mappage seront mises en cache.
2. Carte toutes les instructions Insérer, Mettre à jour et supprimer dans le fichier de remise en état de réapprovisionnement du cache.
3. Le cache sera récité en utilisant l'algorithme le moins récemment utilisé (LRU, le moins récemment utilisé).
4. Le cache sera rafraîchi en fonction de l'intervalle de temps spécifié.
5. Le cache stockera 1024 objets
Propriétés communes des étiquettes de cache:
<cache epiction = "fifo" <! - La stratégie de recyclage est premier, premier-out -> flushinterval = "60000" <! - Temps de rafraîchissement automatique 60S -> size = "512" <! - Cache jusqu'à 512 objets de référence -> readonly = "true" /> <! - Read-only ->
Je vais vous donner des connaissances:
Comme Hibernate, Mybatis a également un mécanisme de cache
Le cache de niveau 1 est basé sur le cache local Hashmap de PerpetualCache (MyBatis est livré avec) et sa portée est la session, donc lorsque la session s'engage ou se ferme, le cache sera effacé.
Le cache de deuxième niveau est également basé sur PerpetualCache par défaut, mais il peut être utilisé pour créer des sources de stockage, telles que ehcache.
Le cache de premier niveau met en cache les instructions SQL, tandis que le cache de deuxième niveau cache l'objet résultat. Voir l'exemple suivant (le niveau de journal de MyBatis est défini sur débogage)