Maison >Java >javaDidacticiel >Qu'est-ce que le cache de requêtes ? Introduction à l'utilisation du cache de requêtes MyBatis

Qu'est-ce que le cache de requêtes ? Introduction à l'utilisation du cache de requêtes MyBatis

零下一度
零下一度original
2017-06-25 10:56:072397parcourir

Veuillez indiquer la source de la réimpression :

Comme mentionné précédemment : Spring+SpringMVC+MyBatis apprentissage et construction approfondis (7) - Chargement retardé de MyBatis

1.

mybatis fournit une mise en cache des requêtes pour réduire la pression sur la base de données et améliorer les performances de la base de données.

mybatis fournit un cache de premier niveau et un cache de deuxième niveau.

Le cache de premier niveau est le cache de niveau SqlSession. Lors de l'exploitation de la base de données, vous devez construire un objet sqlSession. Il existe une structure de données (HashMap) dans l'objet pour stocker les données du cache. Les zones de données de cache (HashMap) entre différentes sqlSession ne s'affectent pas.

Le cache de deuxième niveau est un cache au niveau du mappeur. Plusieurs sqlSession exploitent la même instruction SQL du mappeur. Plusieurs sqlSession peuvent partager le cache de deuxième niveau. Le cache de deuxième niveau s'étend sur sqlSession.

Pourquoi utiliser la mise en cache ?

S'il y a des données dans le cache, il n'est pas nécessaire de les obtenir à partir de la base de données, ce qui améliore considérablement les performances du système.

2. Cache de niveau 1

2.1 Principe de fonctionnement du cache de niveau 1

Lancer une requête d'informations utilisateur avec l'ID utilisateur 1 pour le la première fois, découvrez d'abord s'il y a des informations utilisateur avec l'identifiant 1 dans le cache. Sinon, interrogez les informations utilisateur dans la base de données.

Obtenez des informations utilisateur et stockez les informations utilisateur dans le cache de premier niveau.

Si sqlSession effectue une opération de validation (en effectuant une insertion, une mise à jour, une suppression), videz le cache de premier niveau dans sqlSession. Le but est de stocker les dernières informations dans le cache et d'éviter les lectures sales.

La deuxième fois qu'il est envoyé pour interroger les informations utilisateur avec l'ID utilisateur 1, découvrez d'abord s'il y a des informations utilisateur avec l'ID 1 dans le cache. S'il y en a dans le cache, obtenez les informations utilisateur directement depuis. la cache.

2.2 Test du cache niveau 1

Mybatis prend en charge le cache niveau 1 par défaut et n'a pas besoin d'être configuré dans le fichier de configuration.

Suivez les étapes du principe du cache de premier niveau ci-dessus pour tester.

    @Testpublic void testCache1() throws Exception{
        SqlSession sqlSession=sqlSessionFactory.openSession();
        UserMapper userMapper=sqlSession.getMapper(UserMapper.class);//下边查询使用一个SqlSession//第一次发起请求,查询id为1的用户User user1=userMapper.findUserById(1);
        System.out.println(user1);        //如果sqlSession去执行commit操作(执行插入、更新、删除),清空sqlSession中的一级缓存,//这样做的目的是为了让缓存中存储的是最新的信息,避免脏读。//更新user1的信息user1.setUsername("测试用户22");
        userMapper.updateUser(user1);//执行commit操作去清空缓存        sqlSession.commit();        //第二次发起请求,查询id为1的用户User user2=userMapper.findUserById(1);
        System.out.println(user2);

        sqlSession.close();
    }

2.3 L'application de cache de niveau 1

est officiellement développée en intégrant mybatis et spring, et le contrôle des transactions est en service.

Une méthode de service comprend de nombreux appels de méthode Mapper.

service{

// Au démarrage de l'exécution, démarrez une transaction et créez un objet SqlSession

// Appelez la méthode mapper findUserById(1) pour la première fois

// Appelez la méthode du mappeur findUserById(1) pour la deuxième fois pour obtenir les données du cache de premier niveau

// La méthode se termine et sqlSession est fermée

>

Si vous exécutez deux appels de service pour interroger les mêmes informations utilisateur, le cache de premier niveau ne sera pas utilisé. Parce que la méthode de session se termine, la sqlSession sera fermée et le cache de premier niveau. le cache sera vidé.

3. Cache de deuxième niveau

3.1 Principe du cache de deuxième niveau

Activez d'abord le cache de deuxième niveau de mybatis.

sqlSession1 interroge les informations utilisateur avec l'ID utilisateur 1. Après avoir interrogé les informations utilisateur, il regrette que les données de la requête soient stockées dans le cache de deuxième niveau.

Si sqlSession3 exécute SQL sous le même mappeur et exécute la soumission de validation, les données dans la zone de cache de deuxième niveau sous le mappeur seront effacées.

sqlSession2 interroge les informations utilisateur avec l'ID utilisateur 1, vérifie si des données existent dans le cache et, si c'est le cas, récupère directement les données du cache.

La différence entre le cache de deuxième niveau et le cache de premier niveau : la portée du cache de deuxième niveau est plus grande et plusieurs sqlSession peuvent partager la zone de cache de deuxième niveau d'un UserMapper. UserMapper possède une zone de cache de deuxième niveau (divisée par espace de noms), et d'autres mappeurs ont également leurs propres zones de cache de deuxième niveau (divisées par espace de noms).

Chaque mappeur d'espace de noms possède une zone de cache de deuxième niveau. Si les espaces de noms de deux mappeurs sont identiques, les données obtenues par les deux mappeurs exécutant des requêtes SQL seront stockées dans la même zone de cache de deuxième niveau.

3.2 Activer le cache de deuxième niveau

Le cache de deuxième niveau de Mybatis est au niveau de la portée du mappeur En plus de définir le commutateur principal du cache de deuxième niveau dans SqlMapConfig.xml, il doit être activé. également être activé dans le cache spécifique mapper.xml niveau 2.

Ajouter le fichier de configuration principal SqlMapConfig.xml :

<setting name="cacheEnabled" value="true"/>

Description

 

描述

允许值

默认值

cacheEnabled

对在此配置文件下的所有cache 进行全局性开/关设置。

true false

true

Valeurs autorisées

Valeur par défaut

cacheEnabled

Définissez les paramètres d'activation/désactivation globaux pour tous les caches sous ce fichier de configuration.

vrai faux

true

在UserMapper.xml中开启二级缓存,UserMapper.xml下的sql执行完成后存储在它的缓存区域(HashMap)。

3.3调用pojo类实现序列化接口

为了将缓存数据取出执行反序列划操作,因为二级缓存数据存储介质多种多样,不一定在内存。可能在硬盘、远程等。

3.4测试方法

    @Testpublic void testCache2() throws Exception{
        SqlSession sqlSession1=sqlSessionFactory.openSession();
        SqlSession sqlSession2=sqlSessionFactory.openSession();
        SqlSession sqlSession3=sqlSessionFactory.openSession();
        
        UserMapper userMapper1=sqlSession1.getMapper(UserMapper.class);
        UserMapper userMapper2=sqlSession2.getMapper(UserMapper.class);
        UserMapper userMapper3=sqlSession3.getMapper(UserMapper.class);        //第一次发起请求,查询id为1的用户User user1=userMapper1.findUserById(1);
        System.out.println(user1);//这里执行关闭操作,将sqlSession中的数据写到二级缓存区域        sqlSession1.close();        //使用sqlSession3执行commit()操作User user=userMapper3.findUserById(1);
        user1.setUsername("Joanna");
        userMapper3.updateUser(user);//执行提交,清空UserMapper下边的二级缓存        sqlSession3.commit();
        sqlSession3.close();        //第二次发起请求,查询id为1的用户User user2=userMapper2.findUserById(1);
        System.out.println(user2);
        sqlSession2.close();
    }

3.5禁用二级缓存

在statement中设置useCache=false可以禁用当前select语句的二级缓存,即每次查询都会发出sql,默认情况是true,即该sql使用二级缓存。