MyBatis:缓存

2023-12-15 10:34:51

在这里插入图片描述

缓存

缓存,是数据交换的缓冲区(临时保存数据的地方)。即将数据(数据一般为频繁查询且不易改变)保存在计算机内存中,下次读取数据时直接从内存中获取,以避免频繁的访问数据库或磁盘文件,从而提高程序性能。

MyBatis 缓存,是 MyBatis 提供的一种优化机制,用于提高查询效率和减少与数据库的交互次数。在 MyBatis 缓存中,分为一级缓存二级缓存

一级缓存

一级缓存,是 SqlSession 级别的缓存。即在同一个 SqlSession 中,查询结果会被缓存,以供后续的查询直接使用。在 MyBatis 缓存中,只默认开启一级缓存,而二级缓存需要手动配置开启。另外,一级缓存之间是互相独立的缓存空间,不能通信。

简单示例:
1.使用同一个 SqlSession 中,第一次获取查询结果后再次进行相同的查询,只执行一次 SQL 语句
在这里插入图片描述

查看日志,结果如图:
在这里插入图片描述

2.使用同一个 SqlSession 中,第一次获取查询结果后再次进行不同的查询,执行了两次 SQL 语句(缓存中没有找到对应的结果,所以执行 SQL 语句从数据库中查找数据。当然,找到后也会放入缓存中)
在这里插入图片描述

查看日志,结果如图:
在这里插入图片描述

同一个 SqlSession 下也执行了两次 SQL 语句的其他情况:
(1)使用同一个 SqlSession 中,第一次获取查询结果后再次进行相同的查询,但两次查询之间进行清空缓存(sqlSession.clearCache();)
(2)使用同一个 SqlSession 中,第一次获取查询结果后再次进行相同的查询,但两次查询之间进行增改删操作(缓存会刷新)

3.使用不同的 SqlSession 进行相同的两次查询,执行了两次 SQL 语句
在这里插入图片描述

查看日志,结果如图:
在这里插入图片描述

二级缓存

二级缓存(全局缓存),是 mapper 级别的缓存。即可以跨越多个 SqlSession ,允许在不同的 SqlSession 之间共享查询结果,但需要在 mapper 文件中进行配置。在开启二级缓存情况下,一级缓存的数据会在会话提交或关闭前转存到二级缓存中。

简单示例:
首先,手动配置开启二级缓存。这需要在全局配置文件 mybatis.xml 中的 settings 标签内添加开启配置

<!-- 开启二级缓存 -->
<setting name="cacheEnabled" value="true"/>

接着,映射文件中需要添加 < cache /> 标签

<!-- 开启二级缓存 -->
<cache />

然后,实体类必须实现序列化接口(implements Serializable)
在这里插入图片描述

最后,测试结果。使用不同的 SqlSession 进行相同的两次查询(需要 sqlSession1 关闭),执行了一次 SQL 语句
在这里插入图片描述

查看日志,结果如图:
在这里插入图片描述

开启二级缓存需要在 MyBatis 全局配置文件中配置 cacheEnabled 值为 true 。同时在映射文件中添加 < cache /> 标签。另外,在 select 标签的 useCache 属性中,默认值为 true ,开启二级缓存后,二级缓存生效;若设置为 false ,即使开启二级缓存后也会在该 select 标签中失效。而在 select 标签的 flushCache 属性中,默认值为 false ,使用所有缓存;若设置为 true ,则禁用所有缓存。但是,在增删改标签的 flushCache 属性中,默认值为 true ,执行增删改操作后刷新所有缓存。

文章来源:https://blog.csdn.net/qq_56886142/article/details/132542470
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。