MyBatis
- 缓存
- 一级缓存
- 二级缓存
- 注
缓存
缓存,是数据交换的缓冲区(临时保存数据的地方)。即将数据(数据一般为频繁查询且不易改变)保存在计算机内存中,下次读取数据时直接从内存中获取,以避免频繁的访问数据库或磁盘文件,从而提高程序性能。
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 ,执行增删改操作后刷新所有缓存。