Nous savons que les opérations fréquentes de base de données sont très gourmandes en performances (principalement parce que pour la base de données, les données persistantes sont stockées dans le disque, donc l'opération de requête doit passer par IO, et la vitesse d'opération IO est plusieurs ordres de grandeur plus lente que la vitesse d'opération de mémoire), en particulier pour certaines instructions de requête identiques, les résultats de la requête peuvent être stockés et la requête suivante sera la même chose Lorsque vous interrogez le contenu, vous pouvez obtenir directement les données de la mémoire, ce qui peut considérablement améliorer l'efficacité des requêtes dans certains scénarios.
Le cache de MyBatis est divisé en deux types :
Cache de premier niveau, le cache de premier niveau est Niveau SQLSession cache, pour une même requête, les résultats seront renvoyés depuis le cache au lieu d'interroger la base de données
cache de deuxième niveau, le cache de deuxième niveau est un cache niveau Mapper , qui est défini dans la balise les fichiers peuvent partager un cache, en fonction de la configuration des balises < cache-ref>
Examinons en détail le cache de premier et de deuxième niveau de MyBatis.
Workflow de cache de premier niveau MyBatis
Ensuite, jetez d'abord un œil à MyBatis Processus de travail du cache au niveau du cache. Comme mentionné précédemment, le cache de premier niveau de MyBatis est un cache de niveau SqlSession. Lorsque la méthode openSession() termine son exécution ou que la méthode close de SqlSession est activement appelée, la SqlSession est recyclée et le cache de premier niveau est également recyclé. en même temps. Comme mentionné dans l'article précédent, dans MyBatis, les méthodes selectOne et selectList sont finalement converties en méthode selectList pour l'exécution, alors jetez un œil à l'implémentation de la méthode selectList de SqlSession :
La ligne 3 construit la condition de cache CacheKey What. est impliqué ici ? La condition est considérée comme la même condition que la requête précédente, car la même condition peut renvoyer le résultat précédent. Cette partie du code sera analysée dans la partie suivante.
Ensuite, regardez l'implémentation de la méthode de requête à la ligne 4. Le code se trouve dans CachingExecutor :
1 public int update(MappedStatement ms, Object parameter) throws SQLException {2 ErrorContext.instance().resource(ms.getResource()).activity("executing an update").object(ms.getId());3 if (closed) {4 throw new ExecutorException("Executor was closed.");5 }6 clearLocalCache();7 return doUpdate(ms, parameter);8 }
1 public class CacheKey implements Cloneable, Serializable { 2 3 private static final long serialVersionUID = 1146682552656046210L; 4 5 public static final CacheKey NULL_CACHE_KEY = new NullCacheKey(); 6 7 private static final int DEFAULT_MULTIPLYER = 37; 8 private static final int DEFAULT_HASHCODE = 17; 9 10 private int multiplier;11 private int hashcode;12 private long checksum;13 private int count;14 private List<Object> updateList;15 ...16 }
select a.col1, a.col2, a.col3, b.col1, b.col2, b.col3 from tableA a, tableB b where a.id = b.id;
Copier après la connexion
Les opérations pour tableA et tableB sont définies dans deux mappeurs, appelés respectivement MapperA et MapperB, c'est-à-dire qu'elles appartiennent à deux espaces de noms si la mise en cache est activée à ce moment :
Exécutez l'instruction SQL ci-dessus dans MapperA pour interroger ces 6 champs
tableB a mis à jour les deux champs col1 et col2
MapperA exécute à nouveau l'instruction SQL ci-dessus pour interroger ces 6 champs (à condition il n'est pas exécuté Après toute opération d'insertion, de suppression, de mise à jour)
Le problème se pose à ce moment, même si tableB met à jour col1 dans étape (2) Avec les deux champs de col2 , à l'étape (3), les 6 champs obtenus par MapperA via le cache de deuxième niveau sont toujours les valeurs de l'original 6 champs, car nous obtenons les valeurs de CacheKey à en juger par les trois ensembles de conditions :
L'espace de noms du Mappeur où se trouve l'étiquette+L'attribut id de l'étiquette
Les attributs offset et limit de RowBounds sont une classe utilisée par MyBatis. pour gérer la pagination. Le décalage par défaut est 0 et la limite par défaut est Integer.MAX_VALUE
Pour MapperA, l'une des conditions. S'il n'y a pas de changement, le résultat original sera naturellement renvoyé.
Ce problème est un problème insoluble pour le cache de deuxième niveau de MyBatis, il y a donc une condition préalable pour utiliser le cache de deuxième niveau de MyBatis : Il faut s'assurer que tout augmente Supprimer , modifiez et vérifiez le tout dans le même espace de noms .
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Interprétation des balises SQL dynamiques MyBatis : explication détaillée de l'utilisation des balises Set MyBatis est un excellent cadre de couche de persistance. Il fournit une multitude de balises SQL dynamiques et peut construire de manière flexible des instructions d'opération de base de données. Parmi elles, la balise Set est utilisée pour générer la clause SET dans l'instruction UPDATE, qui est très couramment utilisée dans les opérations de mise à jour. Cet article expliquera en détail l'utilisation de la balise Set dans MyBatis et démontrera ses fonctionnalités à travers des exemples de code spécifiques. Qu'est-ce que Set tag Set tag est utilisé dans MyBati
Explication détaillée de l'erreur Oracle 3114 : Comment la résoudre rapidement, des exemples de code spécifiques sont nécessaires Lors du développement et de la gestion de la base de données Oracle, nous rencontrons souvent diverses erreurs, parmi lesquelles l'erreur 3114 est un problème relativement courant. L'erreur 3114 indique généralement un problème avec la connexion à la base de données, qui peut être provoqué par une défaillance du réseau, un arrêt du service de base de données ou des paramètres de chaîne de connexion incorrects. Cet article expliquera en détail la cause de l'erreur 3114 et comment résoudre rapidement ce problème, et joindra le code spécifique.
Analyse du mécanisme de mise en cache MyBatis : la différence et l'application du cache de premier niveau et du cache de deuxième niveau Dans le framework MyBatis, la mise en cache est une fonctionnalité très importante qui peut améliorer efficacement les performances des opérations de base de données. Parmi eux, le cache de premier niveau et le cache de deuxième niveau sont deux mécanismes de mise en cache couramment utilisés dans MyBatis. Cet article analysera en détail les différences et les applications du cache de premier niveau et du cache de deuxième niveau, et fournira des exemples de code spécifiques pour illustrer. 1. Cache de niveau 1 Le cache de niveau 1 est également appelé cache local. Il est activé par défaut et ne peut pas être désactivé. Le cache de premier niveau est SqlSes
[Analyse de la signification et de l'utilisation du point médian PHP] En PHP, le point médian (.) est un opérateur couramment utilisé, utilisé pour connecter deux chaînes ou propriétés ou méthodes d'objets. Dans cet article, nous approfondirons la signification et l’utilisation des points médians en PHP, en les illustrant avec des exemples de code concrets. 1. Opérateur de point médian de chaîne de connexion L’utilisation la plus courante en PHP consiste à connecter deux chaînes. En plaçant . entre deux chaînes, vous pouvez les assembler pour former une nouvelle chaîne. $string1=&qu
Analyse des nouvelles fonctionnalités de Win11 : Comment ignorer la connexion à un compte Microsoft Avec la sortie de Windows 11, de nombreux utilisateurs ont constaté qu'il apportait plus de commodité et de nouvelles fonctionnalités. Cependant, certains utilisateurs n'aiment pas que leur système soit lié à un compte Microsoft et souhaitent ignorer cette étape. Cet article présentera quelques méthodes pour aider les utilisateurs à ne pas se connecter à un compte Microsoft dans Windows 11 afin d'obtenir une expérience plus privée et autonome. Tout d’abord, comprenons pourquoi certains utilisateurs hésitent à se connecter à leur compte Microsoft. D'une part, certains utilisateurs craignent
Wormhole est un leader en matière d'interopérabilité blockchain, axé sur la création de systèmes décentralisés résilients et évolutifs qui donnent la priorité à la propriété, au contrôle et à l'innovation sans autorisation. Le fondement de cette vision est un engagement envers l'expertise technique, les principes éthiques et l'alignement de la communauté pour redéfinir le paysage de l'interopérabilité avec simplicité, clarté et une large suite de solutions multi-chaînes. Avec l’essor des preuves sans connaissance, des solutions de mise à l’échelle et des normes de jetons riches en fonctionnalités, les blockchains deviennent plus puissantes et l’interopérabilité devient de plus en plus importante. Dans cet environnement d’applications innovant, de nouveaux systèmes de gouvernance et des capacités pratiques offrent des opportunités sans précédent aux actifs du réseau. Les créateurs de protocoles se demandent désormais comment opérer dans ce nouveau marché multi-chaînes.
L'utilisation de caractères d'échappement inférieur ou égal est une exigence courante dans MyBatis, et de telles situations sont souvent rencontrées dans le processus de développement réel. Ci-dessous, nous présenterons en détail comment utiliser le caractère d'échappement inférieur ou égal dans MyBatis et fournirons des exemples de code spécifiques. Tout d’abord, nous devons clarifier comment les caractères d’échappement inférieur ou égal à sont représentés dans les instructions SQL. Dans les instructions SQL, l'opérateur inférieur ou égal commence généralement par "
En raison de contraintes d'espace, voici un bref article : Apache2 est un logiciel de serveur Web couramment utilisé et PHP est un langage de script côté serveur largement utilisé. Lors du processus de création d'un site Web, vous rencontrez parfois le problème qu'Apache2 ne peut pas analyser correctement le fichier PHP, ce qui entraîne l'échec de l'exécution du code PHP. Ce problème est généralement dû au fait qu'Apache2 ne configure pas correctement le module PHP ou que le module PHP est incompatible avec la version d'Apache2. Il existe généralement deux manières de résoudre ce problème :