欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis - 缓存

程序员文章站 2022-07-12 22:30:44
...

1. 概述

什么是缓存?
缓存就是存在于内存中的临时数据

为什么要使用缓存?
为了减少和数据库交互的次数,提高执行效率

适用于缓存的数据
经常查询并且不经常改变的数据
数据的正确与否对最终结果影响不大的

不适用于缓存的数据
经常改变的数据。
数据的正确与否对最终结果影响很大的。例如:商品的库存、银行的汇率、股市的牌价等

2. Mybatis的一级缓存

Mybatis 默认就是使用一次缓存的,不需要配置

一级缓存是 SqlSession 级别的缓存,只要 SqlSession 没有 flush 或 close,它就会存在。当调用 SqlSession 的修改、添加、删除、commit()、close()、clearCache() 等方法时,就会清空一级缓存

Mybatis - 缓存

  • 第一次发起查询用户 id 为 1 的用户信息,Mybatis 会先去找缓存中是否有 id 为 1 的用户信息,如果没有,从数据库查询用户信息

  • 得到用户信息,将用户信息存储到一级缓存中

  • 如果 sqlSession 去执行 commit 操作(执行插入、更新、删除),那么 Mybatis 就会清空SqlSession 中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读

  • 第二次发起查询用户 id 为 1 的用户信息,先去找缓存中是否有 id 为 1 的用户信息,缓存中有,直接从缓存中获取用户信息

3. Mybatis的二级缓存

是Mybatis的SqlSessionFactory的缓存,由同一个SqlSessionFactory创建的SqlSession共享缓存

二级缓存中存的是散装数据而不是对象,所有第二次查询的时候虽然没有再去查询,但是封装成了另一个对象返回

当我们使用二级缓存的时候,所缓存的类一定要实现 java.io.Serializable 接口,这样才可以使用序列化的方式来保存对象。
由于是序列化保存对象,所以二级缓存中存放的是数据,而不是整个对象

配置方法
首先在 Mybatis 配置文件中添加配置

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

接着在映射文件中配置

<mapper namespace="com.minifull.mapper.UserMapper">
    <!-- 使用缓存 -->
    <cache/>
</mapper>

最后在需要使用二级缓存的操作上配置 (如果针对每次查询都需要最新数据的操作,要设置成 useCache=“false”,禁用二级缓存

<select id="listAllUsers" resultMap="UserWithAccountsMap" useCache="true">
    SELECT * FROM user
</select>
相关标签: Mybatis