1.一级缓存:基于PerpetualCache的HashMap本地缓存,其存储作用域为session,当session被flush或close之后,该session中的所有Cache就将清空。

2.二级缓存与一级缓存机制相同,默认也采用PerpetualCache HashMap存储,不同在于其存储作用域为Mapper(Namespace),并且可自定义存储源,如Ehcache。

3.对于缓存数据更新机制,当一个作用域(一级缓存session/二级缓存Namespace )进行了C/U/D操作后,默认该作用域下所有select中的缓存将被clear.


User.java 实体类

public class User {private int id;private String username;private int age;private String sex;//...
}
<select id="getUser" parameterType="int" resultType="com.mybatis.test07.User">select * from users where id = #{id}
</select><update id="updateUser" parameterType="com.mybatis.test07.User">update users set username = #{username}, age = #{age} where id = #{id}
</update>

测试

        SqlSessionFactory factory = MybatisUtil.getFactory();SqlSession session = factory.openSession();String statement = "com.mybatis.test06.userMapper.getUser";User user = session.selectOne(statement, 2);System.err.println(user);user = session.selectOne(statement, 2);System.err.println(user);session.close();//默认情况下一级缓存已开启。两次查询同一个对象,只会进行一次select操作
       SqlSessionFactory factory = MybatisUtil.getFactory();SqlSession session = factory.openSession(true);String statement = "com.mybatis.test07.userMapper.getUser";User user = session.selectOne(statement, 2);System.err.println(user);//进行update操作user.setId(11);statement = "com.mybatis.test07.userMapper.updateUser";System.err.println(user);session.update(statement, user);//重新发出查询statement = "com.mybatis.test07.userMapper.getUser";user = session.selectOne(statement, 2);System.err.println(user);session.close();
        SqlSessionFactory factory = MybatisUtil.getFactory();SqlSession session = factory.openSession(true);String statement = "com.mybatis.test07.userMapper.getUser";User user = session.selectOne(statement, 2);System.err.println(user);SqlSession session1 = factory.openSession(true); user = session1.selectOne(statement, 2);System.err.println(user);session.close();session1.close();//两个不同的session对象

三种情况不能利用一级缓存:①执行了session.clearCache(); ②执行了CUD操作 ③不是同一个session对象


二级缓存以namespace为单元,即以映射文件为单元。Hibernate二级缓存以SessionFactory为单元。

在映射文件中加入 <cache/> 即可

     SqlSessionFactory factory = MybatisUtil.getFactory();SqlSession session = factory.openSession();String statement = "com.mybatis.test07.userMapper.getUser";User user = session.selectOne(statement, 2);System.err.println(user);//User(com.mybatis.test07.User@1a78071) [id=2, username=syd, age=34, sex=男]session.commit();SqlSession session1 = factory.openSession();    user = session1.selectOne(statement, 2);System.err.println(user);//User(com.mybatis.test07.User@182ef6b) [id=2, username=syd, age=34, sex=男]session1.commit();session.close();session1.close();

两次不是同一个对象,但是第二次并没有从数据库中去查询。


1.映射语句文件中的所有select语句将会被缓存

2.映射语句文件中所有的insert update delete语句会刷新缓存

3.缓存会使用Least Recently Used (LRU 最近最少使用) 算法来收回

4.缓存会根据指定的时间间隔来刷新

5.缓存会存储1024个对象

转载于:https://blog.51cto.com/shamrock/1560167

Mybatis学习笔记-一级缓存与二级缓存相关推荐

  1. Mybatis基础学习之一级缓存和二级缓存的简单使用

    前言: 小伙伴们,大家好,我是狂奔の蜗牛rz,当然你们可以叫我蜗牛君,我是一个学习Java半年多时间的小菜鸟,同时还有一个伟大的梦想,那就是有朝一日,成为一个优秀的Java架构师. 这个Mybatis ...

  2. Mybatis一级缓存,二级缓存的实现就是这么简单

    介绍 又到了一年面试季,所以打算写一点面试常问的东西,争取说的通俗易懂.面试高级岗,如果你说熟悉Mybatis,下面这些问题基本上都会问 Mybatis插件的实现原理? 如何写一个分页插件? Myba ...

  3. Mybatis 详解--- 一级缓存、二级缓存

    2019独角兽企业重金招聘Python工程师标准>>> Mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSession级别的缓存.在操作数据 ...

  4. Mybatis的一级缓存和二级缓存详解

    注:本笔记是根据尚硅谷的MyBatis视频记录的 对于任何一个持久层框架,都有缓存机制:缓存在电脑中有一块真实的存储空间(https://baike.baidu.com/item/%E7%BC%93% ...

  5. mybatis高级(3)_延迟加载_深度延迟_一级缓存_二级缓存

    设置延迟加载需要在mybatis.xml中设置 注: 侵入式延迟加载为真时是延迟加载 侵入式延迟加载为假时是深度延迟加载 <!-- 延迟加载和深度延迟加载 --><settings& ...

  6. MyBatis框架:延迟加载策策略、一级缓存、二级缓存

    MyBatis框架:延迟加载策略和缓存 Mybatis 延迟加载策略 1.1 何为延迟加载? 1.2 实现需求 1.3 使用association实现延迟加载 1.3.1 账户的持久层DAO接口 1. ...

  7. 浅谈Mybatis的一级缓存和二级缓存

    MyBatis的缓存机制 缓存的引入 当我们大量执行重复的查询SQL语句的时候,会频繁的和数据库进行通信,会增加查询时间等影响用户体验的问题,可以通过缓存,以降低网络流量,使网站加载速度更快. MyB ...

  8. 查询缓存---Mybatis学习笔记(十)

    mybatis缓存介绍 mybatis提供查询缓存,用于减轻数据压力,提高数据库性能. 如下图,是mybatis一级缓存和二级缓存的区别图解: Mybatis一级缓存的作用域是同一个SqlSessio ...

  9. MyBatis】MyBatis一级缓存和二级缓存

    转载自  MyBatis]MyBatis一级缓存和二级缓存 MyBatis自带的缓存有一级缓存和二级缓存 一级缓存 Mybatis的一级缓存是指Session缓存.一级缓存的作用域默认是一个SqlSe ...

  10. Mybatis学习笔记18 - 缓存

    两级缓存: 一级缓存:(本地缓存):sqlSession级别的缓存.一级缓存是一直开启的:SqlSession级别的一个Map 数据库同一次会话期间查询到的数据会放在本地缓存中.以后如果需要获取相同的 ...

最新文章

  1. tomcat升级_「shell脚本」懒人运维之自动升级tomcat应用(war包)
  2. erwin模型怎么保存_一行命令启动,十分钟内完成部署,Paddle Serving开放模型即服务功能...
  3. linux内存管理:kmap、vmap、ioremap
  4. 现代软件工程讲义 如何提出靠谱的项目建议
  5. Atitit 学习方法 补充 艾龙 著 attilax著 1. Atitit 学习的方法 attilax总结 1 1.1. 2. 基于学习策略的分类 2 2 1.2. 3. 基于所获取知识的表示形
  6. WinCC7.5 SP2 安装与授权(文末附授权软件)
  7. 光环PMP一模知识点解析
  8. linux 平台驱动分析
  9. 昆仑通态触摸屏保存历史曲线_昆仑通态TPC7062存盘时间计算
  10. 单片机设计 指纹识别系统
  11. 笔记本电脑已连接WIFI密码查看方法
  12. [英语阅读]英国13岁男孩当爹引各界热议
  13. 小白记录问题(2)——关于np.savez()与np.laod()储存与读取字典数据的问题
  14. STM32(八)W25Q(16/32/64/128)芯片学习总结
  15. vue与nodejs
  16. 使用Python解决Teamviewer被误认为商业用途的问题
  17. 计算机风筝设计图片教程,如何利用塑料袋制作风筝图解教程
  18. 覆盖vue.js样式_使用Vue.js和Cloudinary在化身上覆盖眼镜/面罩
  19. node+express+mock
  20. leetcod--Missing Number

热门文章

  1. 计算机grand,The Grand
  2. Go github.com/e421083458/golang_common/lib
  3. Go新手上路(时不时更新)
  4. yum install mysql-server 指定版本_mysql 指定版本安装
  5. WIN7上安装OFFICE 2019(未成功)
  6. mod_signalwire.c:1009 Next SignalWire adoption
  7. QQ文件上传不了:什么年代了,还使用简单的关键词过滤,智能一点可好
  8. deb,命令行安装与软件中心安装有差异
  9. can not be used when making a shared object; recompile with -fPIC
  10. 同是共享内存,shm_open与shmget有什么差异?