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算法-单向队列

    队列是一种:先进先出,后进后出的数据结构 单项队列: 从前面删除元素,从后面插入元素,跟现实中排队是一样的道理 这里我们用指针移动位置的方法。因为数组删除元素,如果我们要跟现实中排…

    Java 2023年5月29日
    076
  • Vue Element-ui表单校验规则,你掌握了哪些?

    1、前言 Element-ui表单校验规则,使得错误提示可以直接在form-item下面显示,无需弹出框,因此还是很好用的。 我在做了登录页面的表单校验后,一度以为我已经很了解表单…

    Java 2023年6月14日
    067
  • 如何定义超大二维数组

    #include #include #include using namespace std; int main() { //定义超大二维数组方法一 int *p=new int[…

    Java 2023年6月7日
    076
  • java 代码的良好习惯

    有很多书籍提到了代码开发的良好习惯,但是自己看过后,在开发中并不能每次都想起来。在此处开贴做笔记,以后自己开发的代码,必须符合。 不要在一个代码块的开头把局部变量一次性都声明了(这…

    Java 2023年5月29日
    058
  • java多线程基础学习

    一、多线程概述 1.1、进程和线程的概念 1.1.1、进程 1.1.2、线程 1.2、线程创建的方法 1.2.1、继承Thread类 1.2.2、重写Runnable接口 1.2….

    Java 2023年6月16日
    074
  • 深入理解Apollo核心机制之配置读取——轮询

    前两篇内容《深入理解Apollo核心机制之配置读取——前言》《深入理解Apollo核心机制之配置读取——ConfigService定时扫描》 概述 读取配置除了默认5分钟间隔去轮询…

    Java 2023年6月6日
    0100
  • git 本地项目与远程地址建立连接

    git 本地项目与远程地址建立连接 建立好远程仓库与本地项目地址后在本地项目文件夹内初始化git仓库 git init 复制远程项目路径地址,后执行: git remote add…

    Java 2023年6月5日
    0133
  • Maven 3 从入门到入门

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Java 2023年6月9日
    072
  • 联盟链 Hyperledger Fabric 应用场景

    一、说明 本文主要通过一个例子分享以 Hyperledger Fabric 为代表的联盟链应用场景。 关于 Fabric 的相关概念请先参考文章 《Hyperledger Fabr…

    Java 2023年6月6日
    079
  • 利用神器BTrace 追踪线上 Spring Boot应用运行时信息

    概述 生产环境中的服务可能会出现各种问题,但总不能让服务下线来专门排查错误,这时候最好有一些手段来获取程序运行时信息,比如 接口方法参数/返回值、外部调用情况 以及 函数执行时间等…

    Java 2023年5月30日
    094
  • Java邮件发送中的setRecipient方法使用

    一、方法 setRecipient(Message.RecipientType type, Address address),是用于设置邮件的接收者。 1、有两个参数,第一个参数是…

    Java 2023年6月7日
    056
  • 分布式事务

    这种实现分布式事务的方式需要通过消息中间件来实现。假设有A和B两个系统,分别可以处理任务A和任务B。此时系统A中存在一个业务流程,需要将任务A和任务B在同一个事务中处理。下面来介绍…

    Java 2023年6月8日
    079
  • 简单计算器

    .box{ margin: 0 auto; width: 300px; .text{ margin: 5px; .text input{ width: 100%; height: …

    Java 2023年6月7日
    057
  • 5.日期格式化

    例:”startTime”:{“date”:11,”hours”:0,”seconds&#822…

    Java 2023年6月13日
    082
  • SpringMVC(7)-ssm整合实现增删改查-SpringMVC层

    1引言:这里主要做三件事 1.1resources文件夹下创建spring-mvc.xml并配置:开启注解驱动(mvc:annotation-driven),静态资源过滤(mvc:…

    Java 2023年6月9日
    064
  • “威胁”员工全来上班后,马斯克“尴尬”了:车没地停、工位不够坐、Wi-Fi 还太差

    点击蓝色”程序员黄小斜”关注我哟 加个”星标”,每天和你一起多进步一点点! 整理 | 郑丽媛 出品 | 程序人生(ID:coder_…

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