1.1 Mybatis缓存概述

​ 当用户频繁查询某些固定的数据时,第一次将这些数据从数据库中查询出来,保存在缓存中。当用户再次查询这些数据时,不用再通过数据库查询,而是去缓存里面查询。减少网络连接和数据库查询带来的损耗,从而提高我们的查询效率,减少高并发访问带来的系统性能问题。

经常查询一些不经常发生变化的数据,使用缓存来提高查询效率。

1.2 Mybatis缓存策略

通过缓存策略来减少数据库的查询次数, 从而提高性能,其中Mybatis中缓存分为一级缓存和二级缓存。

2.1 一级缓存

​ 一级缓存是SqlSession级别的缓存,是默认开启的,在参数和SQL完全一样的情况下,我们使用同一个SqlSession对象调用一个Mapper方法,往往只执行一次SQL,因为使用SelSession第一次查询后,MyBatis会将其放在缓存中,以后再查询的时候,如果没有声明需要刷新,并且缓存没有超时的情况下,SqlSession都会取出当前缓存的数据,而不会再次发送SQL到数据库。

2.1.1 分析

​ 一级缓存是SqlSession范围的缓存,执行SqlSession的C(增加)U(更新)D(删除)操作,或者调 用clearCache()、commit()、close()方法,都会清空缓存。

  1. 第一次发起查询用户id为41的用户信息,先去找缓存中是否有id为41的用户信息,如果没有,从数据库查询用户信息。
  2. 得到用户信息,将用户信息存储到一级缓存中。
  3. 如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
  4. 第二次发起查询用户id为41的用户信息,先去找缓存中是否有id为41的用户信息,缓存中有,直接从缓存中获取用户信息。

2.2 二级缓存

二级缓存是namspace级别(跨sqlSession)的缓存,默认不开启,二级缓存的开启需要进行配置,实现二级缓存的时候,MyBatis要求返回的POJO必须是可序列化的。 也就是要求实现Serializable接口,配置方法很简单,只需要在映射XML文件配置 就可以开启 二级缓存了。

2.2.1 分析

​ 二级缓存是mapper映射级别的缓存,多个SqlSession去操作同一个Mapper映射的sql语句,多个SqlSession可以共用二级缓存,二级缓存是跨SqlSession的。

1.映射语句文件中的所有select语句将会被缓存。

2.映射语句文件中的所有insert、update和delete语句会刷新缓存。

2.2.2 二级缓存脏读问题

​ mybatis的二级缓存因为是namespace级别,所以在进行多表查询时会产生脏读问题。

  1. mybatis的缓存,都不需要我们手动存储和获取数据。mybatis会自动维护。
  2. mybatis开启了二级缓存后,那么查询顺序:二级缓存 --> 一级缓存 --> 数据库。
  3. 注意:mybatis的二级缓存会存在脏读问题,需要使用第三方的缓存技术解决问题。
版权属于:it小离

本文链接: https://www.itxiaoli.cn/archives/cache.html

版权声明:本站文章采用 署名-非商业性使用-相同方式共享 4.0

最后修改:2021 年 10 月 29 日 09 : 31 PM
如果觉得我的文章对你有用,请随意赞赏