简介

什么是缓存

**将一次查询的结果暂存至内存,后续查询只需查询缓存**

为什么使用缓存

**减少与数据库的交互次数,减少系统开销,提高系统效率**

什么样的数据能使用缓存

**经常查询且不常修改的数据**

Mybatis缓存

一级缓存

也叫本地缓存,默认开启,无法关闭,只在一次SqlSession中有效(拿到连接->关闭连接),底层由【Map】实现数据存储

  • 与数据库同一次会话期间查询到的数据会放在本地缓存中
  • 若之后需要获取相同数据,直接从缓存中获取
    <select id="queryUserById" resultType="User">
SELECT * FROM user WHERE id = #{id};
</select> <update id="updateUser" parameterType="User">
UPDATE user set name = #{name}, pwd = #{pwd} WHERE id = #{id};
</update>
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1);
User user2 = mapper.queryUserById(1); System.out.println(user == user2);
sqlSession.close();
  • 日志输出SQL语句仅执行一次,且输出结果为true,表明两个user实例对象为同一个
sqlSession.getMapper(UserMapper.class);
User user = mapper.queryUserById(1); User iris = new User(1, "Iris", "123");
mapper.updateUser(iris); User user2 = mapper.queryUserById(1);
System.out.println(user == user2);
  • 在修改数据库数据(哪怕不是目标记录)后再次查询会重新访问数据库

【缓存失效原因】

  • 查询不同的记录
  • 查询不同的Mapper
  • 不同线程查询
  • 增删改操作均可能导致缓存刷新
  • 手动清除

二级缓存

需在核心配置文件中打开缓存【即使默认开启】,才能手动配置缓存属性

开启全局缓存(手动显示开启)

<setting name="cacheEnabled" value="true"/>

全局缓存,由于一级缓存作用域太低从而产生,基于namespace级别的缓存,二级缓存会将每次会话的一次缓存出保存至二级缓存,不同mapper所查询的数据放在其对应缓存【Map】中

二级缓存由标签cache实现,其中可设置相关属性:

  • 缓存策略

    • LRU【默认】:最近最少使用(移除最长时间不被使用的对象)
    • FIFO:先进先出(按对象进入缓存的顺序来移除它们)
    • SOFT:软引用(基于垃圾回收器状态和软引用规则移除对象)
    • WEAK:弱引用(更积极地基于垃圾收集器状态和弱引用规则移除对象)
  • 缓存刷新间隔(ms)
  • 引用数目【默认为1024个对象】
  • 是否仅可读【默认可读写】

    下面的示例创建了一个FIFO缓存,间隔60刷新,最多存储512个对象且返回的对象仅可读
<cache
eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"/>

测试二级缓存是否有效

    SqlSession sqlSession = MybatisUtils.getSqlSession();
SqlSession sqlSession2 = MybatisUtils.getSqlSession(); UserMapper mapper = sqlSession.getMapper(UserMapper.class);
UserMapper mapper2 = sqlSession2.getMapper(UserMapper.class); User user = mapper.queryUserById(1);
System.out.println(user);
sqlSession.close(); User user2 = mapper2.queryUserById(1);
System.out.println(user2); System.out.println(user == user2);
sqlSession2.close();

【结果输出:true】意为sqlSqssion2在sqlSession关闭后从二级缓存中获取到了sqlSession存入的数据。

报错【对象未序列】的解决方法

  • 实例对象继承Serializable

    public class User implements Serializable
  • 设置缓存对象仅可读(mapper.xml中)

    readOnly="true"

小结

  • 只要开启二级缓存,在相同Mapper下均有效
  • 所有数据都会先放在一级缓存中
  • 只有当会话提交/关闭,数据才转存至二级缓存中

Mybatis缓存原理

Mybatis学习笔记-缓存的更多相关文章

  1. Mybatis学习笔记导航

    Mybatis小白快速入门 简介 本人是一个Java学习者,最近才开始在博客园上分享自己的学习经验,同时帮助那些想要学习的uu们,相关学习视频在小破站的狂神说,狂神真的是我学习到现在觉得最GAN的老师 ...

  2. mybatis学习笔记(14)-查询缓存之中的一个级缓存

    mybatis学习笔记(14)-查询缓存之中的一个级缓存 标签: mybatis mybatis学习笔记14-查询缓存之中的一个级缓存 查询缓存 一级缓存 一级缓存工作原理 一级缓存測试 一级缓存应用 ...

  3. mybatis学习笔记之基础框架(2)

    mybatis学习笔记之基础框架(2) mybatis是一个持久层的框架,是apache下的顶级项目. mybatis让程序将主要精力放在sql上,通过mybatis提供的映射方式,自由灵活生成满足s ...

  4. mybatis学习笔记之学习目录(1)

    mybatis学习笔记之学习结构(1) 学习结构: 1.mybatis开发方法 原始dao开发方法(程序需要编写dao接口和dao实现类) mybatis的mapper接口(相当于dao接口)代理开发 ...

  5. Mybatis学习笔记汇总(包括源码和jar包)

    博客整理 Mybatis学习笔记(一)--对原生jdbc中问题的总结 Mybatis学习笔记(二)--Mybatis框架 Mybatis学习笔记(三)--入门程序 MyBatis学习笔记(四)--入门 ...

  6. 【MyBatis学习笔记】

    [MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...

  7. Mybatis学习笔记(二) 之实现数据库的增删改查

    开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...

  8. MyBatis:学习笔记(3)——关联查询

    MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...

  9. MyBatis:学习笔记(1)——基础知识

    MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...

随机推荐

  1. spring中BeanPostProcessor之四:AutowiredAnnotationBeanPostProcessor(01)

    在<spring中BeanPostProcessor之二:CommonAnnotationBeanPostProcessor(01)>中分析了CommonAnnotationBeanPos ...

  2. Java小工具类

    计时器(秒表),计算程序运行时间用的 public class Stopwatch { private static long startTime=0; private static long end ...

  3. CRM软件从哪些方面帮助企业更上一层楼

    CRM顾客智能管理系统可以将"以顾客为管理中心"的管理模式与高新科技方式紧密结合,协助公司搭建优良的客户关系管理,改进顾客的消費感受,进而提升顾客的满意率,为公司产生大量的盈利.据 ...

  4. AcWing 99. 激光炸弹

    地图上有n个目标,用整数x,y表示目标在地图上的位置,每个目标都有一个价值Wi. 注意:不同目标可能在同一位置. 现在有一种新型的激光炸弹,可以摧毁一个包含r个位置的正方形内的所有目标. 激光炸弹的投 ...

  5. 我用段子讲.NET之依赖注入其二

    <我用段子讲.NET之依赖注入其二> "随着我们将业务代码抽象化成接口和实现两部分,这也使得对象生命周期的统一管理成为可能.这就引发了第二个问题,.NET Core中的依赖注入框 ...

  6. MySql:mysql修改密码及配置远程连接

    通过配置文件修改 mysql5.7  mysql库下面的user表没有password字段无法修改密码,5.7版本已经不再使用password来作为密码的字段了  而改成了authentication ...

  7. Java:Java的<<<移位运算符详解

    1) 左移运算(<<)       左移就是把所有位向左移动几位 如:   12 << 2    意思就是12向左移动两位 12的二进制是: 0000 1100 通过这个图我们 ...

  8. iOS基于AVFoundation实现朗读文字

    iOS基于AVFoundation实现朗读文字 1.心理建设 众所周知AVFoundation的朗读是个智障语气,所以想不花钱就只能忍着. 2.speechManager @import AVFoun ...

  9. (精)题解 guP2860 [USACO06JAN]冗余路径Redundant Paths

    (写题解不容易,来我的博客玩玩咯qwq~) 该题考察的知识点是边双连通分量 边双连通分量即一个无向图中,去掉一条边后仍互相连通的极大子图.(单独的一个点也可能是一个边双连通分量) 换言之,一个边双连通 ...

  10. 关于Hadoop调优

    Hadoop生产调优 一.HDFS-核心参数 1.NameNode 内存生产配置 1) NameNode 内存计算 每个文件块大概占用 150byte,一台服务器 128G 内存为例,能存储多少文件块 ...