1.一级缓存

一级缓存是SqlSession级别的缓存。在操作数据库时需要构造 sqlSession对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的sqlSession之间的缓存数据区域(HashMap)是互相不影响的。

Mybatis默认开启一级缓存。

一级缓存的作用域是同一个SqlSession,在同一个sqlSession中两次执行相同的sql语句,第一次执行完毕会将数据库中查询的数据写到缓存(内存),第二次会从缓存中获取数据将不再从数据库查询,从而提高查询效率。当一个sqlSession结束后该sqlSession中的一级缓存也就不存在了。

@Testpublic void testCache1() throws Exception{SqlSessionsqlSession = sqlSessionFactory.openSession();//创建代理对象UserMapperuserMapper = sqlSession.getMapper(UserMapper.class);//下边查询使用一个SqlSession//第一次发起请求,查询id为1的用户Useruser1 = userMapper.findUserById(1);System.out.println(user1);//    如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。//更新user1的信息user1.setUsername("测试用户22");userMapper.updateUser(user1);//执行commit操作去清空缓存sqlSession.commit();//第二次发起请求,查询id为1的用户Useruser2 = userMapper.findUserById(1);System.out.println(user2);sqlSession.close();}

如果不commit的错误流程为:

开始执行时,开启事务,创建SqlSession对象
第一次调用mapper的方法findUserById(1)
更新数据
第二次调用mapper的方法findUserById(1),从一级缓存中取数据
aop控制 只要方法结束,sqlSession关闭 sqlsession关闭后就销毁数据结构,清空缓存
Service结束sqlsession关闭

因为上面有commmit操作,所以正确流程

开始执行时,开启事务,创建SqlSession对象
第一次调用mapper的方法findUserById(1)
更新数据
清空commit
第二次调用mapper的方法findUserById(1),从一级缓存中无数据,从数据库中取数据
aop控制 只要方法结束,sqlSession关闭 sqlsession关闭后就销毁数据结构,清空缓存
Service结束sqlsession关闭

只要是在同一个sqlssesion中,一级缓存才会生效,如果sqlssesion.commit()或者是sqlsession.close()就会清空sqlssion,一级缓存也随之消失。

2.二级缓存

二级缓存介绍

二级缓存是mapper级别的缓存,多个SqlSession去操作同一个Mapper的sql语句,多个SqlSession去操作数据库得到数据会存在二级缓存区域,多个SqlSession可以共用二级缓存,二级缓存是多个SqlSession共享的。

UserMapper有一个二级缓存区域(按namespace分,如果namespace相同则使用同一个相同的二级缓存区),其它mapper也有自己的二级缓存区域(按namespace分)。

也是就是说拥有相同的namespace的UserMapper共享一个二级缓存

开启缓存

SqlMapConfig.xml中

<setting name="cacheEnabled"value="true"/><!-- 全局配置参数,需要时再设置 --><settings><!-- 开启二级缓存  默认值为true --><setting name="cacheEnabled" value="true"/></settings>

在UserMapper.xml中开启二缓存,UserMapper.xml下的sql执行完成会存储到它的缓存区域(HashMap)。

下面是开启redis缓存:

<mapper namespace="cn.mybatis.xml.mapper.UserMapper"><!-- redis配置项 --><cache type="org.mybatis.caches.redis.RedisCache" /> ...

至于具体的redis与mybatis的整合请参见:https://blog.csdn.net/magi1201/article/details/85635878

如何使用二级缓存

public class Userimplements Serializable {//Serializable实现序列化,为了将来反序列化
// 二级缓存测试@Testpublic void testCache2() throws Exception {SqlSessionsqlSession1 = sqlSessionFactory.openSession();SqlSessionsqlSession2 = sqlSessionFactory.openSession();SqlSessionsqlSession3 = sqlSessionFactory.openSession();// 创建代理对象UserMapperuserMapper1 = sqlSession1.getMapper(UserMapper.class);// 第一次发起请求,查询id为1的用户Useruser1 = userMapper1.findUserById(1);System.out.println(user1);//这里执行关闭操作,将sqlsession中的数据写到二级缓存区域sqlSession1.close();//使用sqlSession3执行commit()操作UserMapperuserMapper3 = sqlSession3.getMapper(UserMapper.class);Useruser  = userMapper3.findUserById(1);user.setUsername("张明明");userMapper3.updateUser(user);//执行提交,清空UserMapper下边的二级缓存sqlSession3.commit();sqlSession3.close();UserMapperuserMapper2 = sqlSession2.getMapper(UserMapper.class);// 第二次发起请求,查询id为1的用户Useruser2 = userMapper2.findUserById(1);System.out.println(user2);sqlSession2.close();}

执行流程:

sqlsession1中使用findUserById(1)
关闭sqlsession1
sqlsession3中使用findUserById(1),从缓存中取出数据
sqlSession3.commit();
sqlSession3.close()
sqlSession2中使用findUserById(1)无法拿到数据(commit刷新二级缓存)
sqlSession2.close()

参考文献:
https://blog.csdn.net/u012373815/article/details/47069223
https://blog.csdn.net/weixin_36380516/article/details/73194758
https://blog.csdn.net/eson_15/article/details/51669608

mybatis中一级缓存和二级缓存相关推荐

  1. MyBatis中的一级缓存和二级缓存介绍

    先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据库的压力,同时提高系统性能. 一级缓存 一级 ...

  2. java mysql 二级缓存_深入理解MyBatis中的一级缓存与二级缓存

    http://blog.csdn.net/weixin_36380516/article/details/73194758 先说缓存,合理使用缓存是优化中最常见的,将从数据库中查询出来的数据放入缓存中 ...

  3. Mybatis 中的一级缓存与二级缓存

    一,Mybatis中为什么要有缓存   缓存的意义是将用户经常查询的数据放入缓存(内存)中去,用户去查询数据的时候就不需要从磁盘(关系型数据库)中查询,直接从缓存中查询,从而提高了查询效率,解决了高并 ...

  4. MyBatis中一级缓存和二级缓存详解

    缓存的作用 首先缓存的合理使用是优化中最常见的,将从数据库中查询出来的数据放入缓存中,下次使用时不必从数据库查询,而是直接从缓存中读取,避免频繁操作数据库,减轻数据的压力,同时提高系统性能. 为什么需 ...

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

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

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

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

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

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

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

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

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

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

最新文章

  1. MySQL 学习笔记(4)— 组合查询、子查询、插入数据、更新/删除表数据、增加/删除表中的列以及重命名表
  2. 【iOS-cocos2d-X 游戏开发之十六】Cocos2dx编译后的Android自动使用(-hd)高清图设置自适应屏幕...
  3. Codeforces Round #601 (Div. 2)D. Feeding Chicken,二维压一维,几何平面的分配
  4. oracle 增长型分区,oracle 11g 分区表创建(自动按年分区)
  5. Java Integer的缓存策略
  6. ConEmu状态栏的设置介绍
  7. 哈希扩展长度攻击_哈希长度扩展攻击
  8. java double精确比较,Java float比double更精确?
  9. python爬取天气数据山东_Python的学习《山东省各城市天气爬取》
  10. python中key_python属性和key的区别?
  11. PHP读取TXT中文乱码的解决方法
  12. 01背包问题理解笔记
  13. 典型行业大数据应用和安全风险和解决方案
  14. python加粗线宽代码_python-增加matplotlib中图例行的线宽
  15. Python高级编程第2版_张亮 阿信(译)_人民邮电出版社_2017-10_v2_完整版
  16. OvR逻辑回归多分类算法
  17. Python for Data Analysis | NumPy
  18. android 盒子排名,2020年电视盒子排行榜:盘点今年性能最高的五款电视盒子
  19. 2021-06-28 什么是一清机跟二清机、费率、分润、MCC码_POS机
  20. 棋牌游戏运营框架思路

热门文章

  1. DirectX11入门教程——第二篇:DirectX11的基础知识
  2. 秒速五厘米One more time,One more chance
  3. Java的自学之旅06
  4. BUCK电路输出电容计算
  5. Hive(一)如何搭建Hive?(Hive入门教程)
  6. 亚马逊国际获得AMAZON商品详情 关键字搜索API 调用案例分享
  7. ai图像识别python的项目_Python3调用百度AI识别图片中的文字功能示例【测试可用】...
  8. 炫舞浪漫爱有没有修改服务器,炫舞浪漫爱新手指南 轻轻松松做大神
  9. 首次使用电算化的单位,应当采用计算机与手工核算并行,会计从业资格继续教育学习试题...
  10. 荣耀畅玩5a android5.0,华为荣耀畅玩5A官方固件rom包_荣耀畅玩5A刷机包_升级包