Cache dans Mybatis : principes et fonctionnement

Introduction aux mécanismes de cache

Le cache désigne un stockage temporaire en mémoire accélérant l'accès aux données consultées fréquemment. En interrogeant le cache plutôt que la base de données sur disque, on minimise les interactions, réduit la charge sur les systèmes et améliore les performances, particulièrement dans les environnements à forte concurrence.

Système de cache dans Mybatis

Mybatis intègre une solution de cache flexible et configurable. Elle se compose de deux niveaux : le cache de premier niveau, actif par défaut au sein d'une session SQL, et le cache de second niveau, qui requiert une activation manuelle et s'applique au niveau de l'espace de noms.

Cache de premier niveau

Ce cache est lié à une session SQL individuelle et est activé automatiquement. Les résultats des requêtes sont stockés durant la vie de la session. Il fonctionne comme une table de hachage en mémoire.

Exemple illustratif avec un test unitaire :


import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.example.dao.UtilisateurMapper;
import com.example.model.Utilisateur;
import com.example.util.SessionFactory;

public class TestCacheLocal {
    @Test
    public void verifierCacheSession() {
        SqlSession session = SessionFactory.ouvrirSession();
        UtilisateurMapper mapper = session.getMapper(UtilisateurMapper.class);
        Utilisateur user1 = mapper.chercherParId(1);
        System.out.println(user1);
        System.out.println("---");
        Utilisateur user2 = mapper.chercherParId(1);
        System.out.println(user2);
        session.close();
    }
}

Avec les logs activés, on constate que la requête SQL n'est exécutée qu'une fois, la seconde lecture provenant du cache local.

Situations où le cache de premier niveau est contourné :

  • Requêtes distinctes dans la même session.
  • Opérations de modification (ajout, suppression, mise à jour) intercalées entre les requêtes.
  • Effacement explicite via session.clearCache().
  • Consultation de mappers différents.

Cache de second niveau

Ce cache est partagé entre toutes les sessions appartenant à un même espace de noms. Il est désactivé par défaut et nécessite une configuration.

Activation dans le fichier global de configuration :


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

Dans le fichier mapper, on peut spécifier des options via la balise <cache> :


<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />

Test pour valider le comportement du cache de second niveau :


import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.example.dao.UtilisateurMapper;
import com.example.model.Utilisateur;
import com.example.util.SessionFactory;

public class TestCacheGlobal {
    @Test
    public void verifierCachePartage() {
        SqlSession sessionA = SessionFactory.ouvrirSession();
        UtilisateurMapper mapperA = sessionA.getMapper(UtilisateurMapper.class);
        Utilisateur objA = mapperA.chercherParId(1);
        System.out.println(objA);
        sessionA.close();

        SqlSession sessionB = SessionFactory.ouvrirSession();
        UtilisateurMapper mapperB = sessionB.getMapper(UtilisateurMapper.class);
        Utilisateur objB = mapperB.chercherParId(1);
        System.out.println(objB);
        sessionB.close();

        System.out.println(objA == objB);
    }
}

Ce code démontre que les données persistent entre les sessions via le cache de second niveau, à condition que les objets soient sérialisables.

Étiquettes: MyBatis Cache SQL Java ORM

Publié le 13 juillet à 17h08