MyBatis的二级缓存

二级缓存的原理

二级缓存的原理和一级缓存一样,第一次查询会将数据放到缓存中,然后第二次查询直接去缓存读取。

但是一级缓存是基于 SqlSession 的,二级缓存是基于 mapper 的 namespace 的。

也就是说,多个 SqlSession 可以共享同一个二级缓存区域。如果两个 mapper 的 namespace 相同,那么即使是两个 mapper,这两个 mapper 执行 sql 查询的数据也将保存在相同的二级缓存区域中。

MyBatis的二级缓存

如何使用二级缓存

注意:User 需要实现序列化接口。

开启二级缓存

和一级缓存不一样,二级缓存需要手动开启。

首先在全局配置文件 sqlMapConfig.xml 中加入如下代码


然后在 UserMapper.xml 中开启二级缓存。


如果是使用注解方式,在 IUserMapper 上写上注解 @CacheNamespace

@CacheNamespace
public interface IUserMapper {
}

测试代码

public class SecondCacheTest {
    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void before() throws Exception {
        InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    }

    @Test
    public void secondLevelCache() {
        SqlSession sqlSession1 = sqlSessionFactory.openSession();
        SqlSession sqlSession2 = sqlSessionFactory.openSession();

        IUserMapper userMapper1 = sqlSession1.getMapper(IUserMapper.class);
        IUserMapper userMapper2 = sqlSession2.getMapper(IUserMapper.class);

        User user1 = userMapper1.findUserById(1);
        // 清空一级缓存
        sqlSession1.close();
        User user2 = userMapper2.findUserById(1);
        System.out.println(user1 == user2);
    }
}

效果如下

Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@56528192]
==>  Preparing: select * from user where id=?

==> Parameters: 1(Integer)

可以看到,两次请求,只有第一次输出了 sql , 并且输出了缓存命中率是 0.5 。

useCache 和 flushCache

  • useCache 用来设置是否禁用二级缓存。在 statement 中设置 useCache=”false” 可以禁用当前 select 语句的二级缓存
    *

  select * from user where id=#{id}

  • 设置 statement 的 flushCache=”true” 即 刷新缓存 ,默认情况下就是 true。因为一般不设置,默认即可。
  • 注解方式使用
/**
 * 根据ID查询用户
 *
 * @param id
 * @return
 */
@Options(useCache = false, flushCache = Options.FlushCachePolicy.TRUE)
@Select("select * from user where id=#{id}")
User findUserById(Integer id);

文章更新历史
2022-12-25 feat: 初稿

Original: https://www.cnblogs.com/tangyouwei/p/mybatis-s-secondary-cache-z2ssaab.html
Author: 灯塔下的守望者
Title: MyBatis的二级缓存

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/570283/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 设计模式之备忘录模式

    备忘录模式又叫做快照模式,属于行为型模式。是指使用一个备忘录对象来存储另一个对象内部状态的快照。备忘录模式的用以是在不破坏封装的条件下,将一个对象的状态捕捉住,并外部化,存储起来,…

    Java 2023年6月5日
    082
  • JAVA基础学习第四天!

    精华笔记: 1.Scanner接收用户输入的数据:共3步———–不需要理解,先记住它,面向对象第五天才能理解 2.分支结构: -if…

    Java 2023年6月13日
    084
  • 【Redis】Redis Cluster-集群数据迁移

    Redis通过对KEY计算hash,将KEY映射到slot,集群中每个节点负责一部分slot的方式管理数据,slot最大个数为16384。在集群节点对应的结构体变量clusterN…

    Java 2023年6月8日
    083
  • 【Java】finally用法

    一.概述 二. finally会执行的情况 1.有catch(无异常) 3.有catch(try异常) 4.有catch(catch异常) 5.有catch(try/catch都异…

    Java 2023年5月29日
    0110
  • 设计模式—建造者模式

    类型:创建型 目的:创建对象时,提升属性设置的 灵活性。 灵活性 类中定义了大量属性时,通常为了创建对象时属性初始设置的便利随之定义大量的构造方法。为了既不定义过多的构造方法,又保…

    Java 2023年6月7日
    073
  • Springboot整合二 集成 rabbitmq

    1、在application.yml文件中进行RabbitMQ的相关配置先上代码 spring: rabbitmq: host: 192168.21.11 port: 5672 u…

    Java 2023年5月30日
    081
  • LocalDateTime.now()在SpringBoot项目中获取时间比服务器系统时间早8h

    解决方法:启动类代码中添加如下 posted @2021-11-10 16:52 雪山上的蒲公英 阅读(520 ) 评论() 编辑 / 返回顶部代码 / Original: htt…

    Java 2023年5月29日
    077
  • nginx常用常忘的配置方法

    参考网址 具体应用 location /images/ { root /opt/html/; try_files $uri $uri/ /images/default.gif; }…

    Java 2023年5月30日
    073
  • 从零玩转SpringSecurity+JWT整合前后端分离

    从零玩转SpringSecurity+JWT整合前后端分离 2021年4月9日 · 预计阅读时间: 50 分钟 一、什么是Jwt? Json web token (JWT), 是为…

    Java 2023年6月9日
    081
  • BaseServlet抽取以及UserServlet和页面路径改写

    BaseServlet抽取 优化Servlet 减少Servlet的数量,现在是一个功能一个Servlet,将其优化为一个模块一个Servlet, 相当于在数据库中一张表对应一个S…

    Java 2023年6月6日
    095
  • 【K8S】K8S入门基础知识

    一、K8S基础知识 K8S是什么 K8S(Kubernetes)是⼀个容器集群管理系统,可以做容器集群的⾃动化部署,⾃动化扩缩容,维护等功能 为什么要用K8S 传统应⽤部署是通过将…

    Java 2023年6月8日
    091
  • 66.落空

    dfsd posted @2022-09-28 08:39 随遇而安== 阅读(8 ) 评论() 编辑 Original: https://www.cnblogs.com/55zj…

    Java 2023年6月7日
    081
  • javaweb学生管理系统 第一次总结

    JavaWeb 学生管理系统 第一次总结 ; 具备的知识 java se 高级数据库jsselvetEl表达式jsp 项目 目录结构 [外链图片转存失败(img-dfQq8aOt-…

    Java 2023年6月8日
    092
  • 003-博学谷-年度钻石C++/C-Unix/Linux(2)

    常用命令 3.1 概述 很多人可能在电视或电影中看到过类似的场景,黑客面对一个黑色的屏幕,上面飘着密密麻麻的字符,梆梆一顿敲,就完成了窃取资料的任务。 Linux 刚出世时没有什么…

    Java 2023年6月7日
    0125
  • jdk8系列二、jdk8方法引用、重复注解、更好的类型推断、新增注解

    一、方法引用 方法引用使得开发者可以直接引用现存的方法、Java类的构造方法或者实例对象。方法引用和Lambda表达式配合使用,使得java类的构造方法看起来紧凑而简洁,没有很多复…

    Java 2023年5月30日
    097
  • SpringBoot定时任务-Spring自带的定时任务是如何实现的?有何注意点?

    通过前文我们基本梳理了定时任务体系:Timer和ScheduledExecutorService是JDK内置的定时任务方案,以及Netty内部基于时间轮实现的HashedWheel…

    Java 2023年6月6日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球