专栏首页SSM框架学习Mybatis中的延迟加载 一级缓存 二级缓存
原创

Mybatis中的延迟加载 一级缓存 二级缓存

Mybatis中的延迟加载

问题:在一对多中,当我们有一个用户,它有100个账户。 在查询用户的时候,要不要把关联的账户查出来? 在查询账户的时候,要不要把关联的用户查出来?

在查询用户时,用户下的账户信息应该是,什么时候使用,什么时候查询的。 在查询账户时,账户的所属用户信息应该是随着账户查询时一起查询出来。

什么是延迟加载

在真正使用数据时才发起查询,不用的时候不查询。按需加载(懒加载)

什么是立即加载

不管用不用,只要一调用方法,马上发起查询。

对于表关系: 一对多,多对多:通常情况下我们都是采用延迟加载 多对一,一对一:通常情况下我们都时采用立即加载

可以在SqlMapConfig中进行配置

    <settings>
        <!-- 开启Mybatis支持延迟加载 -->
        <setting name="lazyLoadingEnabled" value="true"/>
        <setting name="aggressiveLazyLoading" value="false"/>
    </settings>

Mybatis中的缓存

什么是缓存

存在于内存中的临时数据

为什么使用缓存

减少和数据库的交互次数,提高执行效率

适用于缓存的数据

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

适用于缓存的数据

经常改变的数据 数据的正确与否对最终结果影响很大的 例如:商品的库存,银行的汇率,股市的牌价

Mybatis中的一级缓存

一级缓存:它指的是Mybatis中SqlSession对象的缓存 当我们执行查询之后,查询的结果会同时存入到SqlSession为我们提供的一块区域 该区域的结构是一个Map。当我们再次查询同样的数据,mybatis会先去SqlSession中查询是否有,有的话直接拿出来用 当SqlSession对象消失时,mybatis的一级缓存也就消失了

一级缓存的分析

一级缓存是 SqlSession 范围的缓存,当调用 SqlSession 的修改,添加,删除,commit(),close()等方法时,就会清空一级缓存。

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

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

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

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

Mybatis中的二级缓存

二级缓存:它指的是Mybatis中SqlSessionFactory对象的缓存。由同一个SqlSessionFactory对象创建的SqlSession共享其缓存。 二级缓存的使用步骤

第一步:让Mybatis框架支持二级缓存(在SqlMapConfig.xml中配置)

第二步:让当前的映射文件支持二级缓存(IUserDao.xml中配置)

第三步:让当前的操作支持二级缓存(在select标签中配置)

二级缓存的分析

首先开启 mybatis 的二级缓存。

sqlSession1去查询用户信息,查询到用户信息会将查询数据存储到二级缓存中。

如果 SqlSession3去执行相同 mapper 映射下sql,执行commit 提交,将会清空该 mapper 映射下的二 级缓存区域的数据。

sqlSession2 去查询与 sqlSession1 相同的用户信息,首先会去缓存中找是否存在数据,如果存在直接从 缓存中取出数据。

当我们在使用二级缓存时,所缓存的类一定要实现 java.io.Serializable 接口,这种就可以使用序列化方式来保存对象。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mybatis执行查询方法流程分析(纯干货) 创建代理对象的分析

    Map的Key(通过String):com.bruce.dao.IUserDao.findAll

    韦恩少爷的背
  • Mybatis入门 连接池介绍与分类 Mybatis使用POOLED UNPOOLED配置连接池的原理分析

    当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器

    韦恩少爷的背
  • Mybatis注解开发 一对一 一对多 @One @Many介绍

    一对多,多对多:通常情况下我们都是采用延迟加载 多对一,一对一:通常情况下我们都时采用立即加载

    韦恩少爷的背
  • mybatis 详解(九)------ 一级缓存、二级缓存

      上一章节,我们讲解了通过mybatis的懒加载来提高查询效率,那么除了懒加载,还有什么方法能提高查询效率呢?这就是我们本章讲的缓存。   本篇源码下载链接:...

    IT可乐
  • Redis(六)---缓存穿透/缓存雪崩/缓存击穿

    缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询...

    Coxhuang
  • 4种常见的缓存问题及解决方案详解

    使用缓存可以缓解大流量压力,显著提高程序的性能。我们在使用缓存系统时,尤其是大并发情况下,经常会遇到一些“疑难杂症”。本文总结了一些使用缓存时常见的问题及解决方...

    程序员追风
  • MyBatis缓存技术入门就这么简单

    在一个Web项目中,查询数据库中的操作算是一个非常常用的操作,但是有些数据会被经常性的查询,而每一次都去数据库中查询这些重复的数据,会很消耗数据库的资源,同时使...

    BWH_Steven
  • 你所不知道的缓存的使用场景

      基本就是数据库里面啥样,我缓存也啥样,数据库里面有商品信息,缓存里面也放商品信息,唯一不同的是,数据库里面是全量的商品信息,缓存里面是最热的商品信息。

    慕容千语
  • 使用缓存的正确姿势

    撸码那些事
  • 使用缓存的正确姿势

    缓存是现在系统中必不可少的模块,并且已经成为了高并发高性能架构的一个关键组件。这篇博客我们来分析一下使用缓存的正确姿势。

    撸码那些事

扫码关注云+社区

领取腾讯云代金券