一级缓存流程

一级缓存有效的因素

一级缓存有效测试

public class User {private Integer id;private String name;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}
public interface UserMapper {@Select("select name from user where id = #{id}")String selectById(@Param("id") int id);@Update("update user set name=#{arg1} where id=#{arg0}")void updateById(int id,String name);@Select("select * from user where id = #{id}")User selectUserById(@Param("id") int id);@Select("select * from user where id = #{id}")User selectUserById2(@Param("id") int id);
}
public class FirstCacheTest {private SqlSessionFactory sqlSessionFactory;private SqlSession sqlSession;@Beforepublic void init() throws IOException {//获取构造器SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//解析XML 并构造会话工厂sqlSessionFactory = builder.build(Resources.getResourceAsStream("mybatis-config.xml"));sqlSession = sqlSessionFactory.openSession();}/*** SQL和参数必须相同*/@Testpublic void test1(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user1 = userMapper.selectUserById(1);User user2 = userMapper.selectUserById(1);System.out.println(user1==user2); //true 表示走一级缓存}/*** 必须是相同的statementID*/@Testpublic void test2(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);//statementID: dao.UserMapper.selectUserByIdUser user1 = userMapper.selectUserById(1);//statementID: dao.UserMapper.selectUserById2User user2 = userMapper.selectUserById2(1);System.out.println(user1==user2); //false}/*** sqlSession必须一样,一级缓存也叫会话级缓存*/@Testpublic void test3(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user1 = userMapper.selectUserById(1);User user2 = sqlSessionFactory.openSession().getMapper(UserMapper.class).selectUserById(1);System.out.println(user1==user2); //false}/*** RowBounds 返回行范围必须相同*/@Testpublic void test4(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user1 = userMapper.selectUserById(1);//分页RowBounds rowBounds = new RowBounds(0, 1);List list = sqlSession.selectList("dao.UserMapper.selectUserById",1,rowBounds);System.out.println(user1==list.get(0)); //false}/*** 未手动清空缓存* 未执行update (数据一致性)* 未提交或回滚*/@Testpublic void test5(){UserMapper userMapper = sqlSession.getMapper(UserMapper.class);User user1 = userMapper.selectUserById(1);//sqlSession.clearCache();//userMapper.updateById(2,"eee");sqlSession.commit();User user2 = userMapper.selectUserById(1);System.out.println(user1==user2); //false}
}

源码分析一级缓存失效原因

运行时参数相关

首先从localCache 中获取数据,先判断key 的组成。

key是在Executor里,而Executor在SqlSession里,所以必须是在同一个会话中。5:mysql是设置的环境,一般操作肯定是在同一个环境中,可以不考虑。

操作与配置相关

queryStack是用于嵌套查询的,等于0表示没有子查询。子查询依赖一级缓存,不能删除缓存。

清除缓存的操作完全符合之前的描述。

Mybatis源码学习二(一级缓存)相关推荐

  1. mybatis源码考究二(sqlsession线程安全和缓存失效)

    mybatis源码考究二 1.mybatis整合spring解决sqlsession线程安全问题 2.mybatis整合spring一级缓存失效问题 mybatis结合spring使用 1.项目依赖 ...

  2. 手把手带你阅读Mybatis源码(三)缓存篇

    点击上方"Java知音",选择"置顶公众号" 技术文章第一时间送达! 前言 大家好,这一篇文章是MyBatis系列的最后一篇文章,前面两篇文章:手把手带你阅读M ...

  3. 【博学谷学习记录】超强总结,用心分享 | 架构师 Mybatis源码学习总结

    Mybatis源码学习 文章目录 Mybatis源码学习 一.Mybatis架构设计 二.源码剖析 1.如何解析的全局配置文件 解析配置文件源码流程 2.如何解析的映射配置文件 Select inse ...

  4. Mybatis源码学习(三)SqlSession详解

    前言 上一章节我们学习了SqlSessionFactory的源码,SqlSessionFactory中的方法都是围绕着SqlSession来的.,那么SqlSession又是什么东东呢?这一章节我们就 ...

  5. 【Mybatis源码学习】概述

    [Mybatis源码学习]概述 1.怎样下载源码 1.1 下载地址 1.2 导入Idea 1.2.1 环境 1.2.2 部署与打包 2.源码架构 2.1 核心流程三大阶段 2.1.1 初始化 2.1. ...

  6. mybatis源码阅读(二):mybatis初始化上

    转载自  mybatis源码阅读(二):mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与 ...

  7. Mybatis源码学习-动态代理

    Mybatis源码学习-动态代理 binding包下面是mybatis的mapper动态代理 // Mybatis官方手册建议通过mapper对象访问mybatis,因为使用mapper看起来更优雅 ...

  8. Mybatis源码学习笔记之Mybatis二级缓存

    简介   Mybatis一级缓存是会话级的缓存,而二级缓存则是应用级别的缓存,默认关闭,二级缓存使用不慎可能会导致脏读. 开启方式(SpringBoot+Mybatis)   application. ...

  9. MyBatis源码学习笔记(从设计模式看源码)

    文章目录 1.源码分析概述 ①.Mybatis架构分析 ②.门面模式 ③.设计模式的原则 2.日志模块分析 ①.适配器模型 ②.动态代理 ③.日志模块分析 3.数据源模块分析 ①.工厂模式 ②.数据源 ...

最新文章

  1. 一个关于解决序列化问题的编程技巧
  2. 【OpenGL】十四、OpenGL 绘制三角形 ( 绘制 GL_TRIANGLE_STRIP 三角形 | GL_TRIANGLE_STRIP 三角形绘制分析 )
  3. cornerMinEigenVal函数
  4. python期末知识点_史上最全的Python知识点整理之基本语法
  5. 小汤学编程之JAVA基础day07——面向对象(二):封装、继承与多态
  6. 计算理论入门 1.1 命题逻辑
  7. 面向未来 “亿”触即发-中科曙光技术创新大会重磅发布多项创新举措与成果...
  8. 技嘉主板BIOS修改风扇转速设置详细教程
  9. js计算100以内所有奇数的和
  10. 视频教程-VBScript脚本语言编程与自动化运维操作学习篇-其他
  11. ubuntu 下应用 Python 和 SL4A 的 Android 应用程序搭建您自己的android研发环境
  12. VS2015无法新建项目错误及解决方法:无法打开“……/VC?VCWizards/default.vcxproj”因为此版本的应用程序不支持其项目类型(.vcxproj)
  13. 2019年云化国际发展趋势_2019年3种令人惊讶的云趋势-您首先在这里听到了
  14. karma+phantomjs+mocha+chai使用心得
  15. 计算机网络室工作总结,计算机教室工作总结范文
  16. 按量收费云盘_阿里云创建按量付费云盘
  17. AndroidStudio 更换炫酷的主题
  18. 01.区块链是什么?
  19. 将AS中Module编译成JRA包引用
  20. 网页设计(前端)学习笔记

热门文章

  1. 长连接、心跳和断线重连
  2. 爱奇艺2020校园招聘全面启动
  3. head 10字节_创新创业协会|访字节跳动,品“字节范”
  4. nodejs+vue+elementui宾馆酒店入住管理系统java-python
  5. systemctl-service服务添加环境变量及模板
  6. 基于前端页面开发课程教学网站的设计与实现
  7. seaborn添加数据标签_常见Seaborn图的数据标签快速指南
  8. 高效工具篇-画思维导图用什么?
  9. CentOS7增加SSH_PUB key登录
  10. 基于单片机的LED照明系统的设计