MyBatis一级缓存的笔记及记录】的更多相关文章

精髓内容来源于<图灵学院> 一.概述: 一级缓存是MyBatis天然自带的,是默认开启且没有关闭的地方,1级缓存只能作用于查询回话中,所以也叫会话缓存: 这里举个例子: 订单表存在一对多的关系,为了尽可能的减少join的查询,进行了分阶段查询: 先查询出订单表,在根据订单的用户ID查询用户信息表,最后将数据进行整合.如果订单表中存在重复的用户ID,就会出现很多没有必要的重复查询. 1级缓存解决了这个问题(1个语句被执行多次,也就是大家说的“N+1”的问题),在同一次查询回话中如果出现相同的语句…
一.什么是二级缓存: 由于一级缓存是一次性的.临时的:每个会话都会创建一个新的:多个会话之间是不能共享的: 二级缓存用于解决一级缓存的不足:每一个“namespace”都会对应一个二级缓存:执行查询的时候先在二级缓存中查找,如果没有再到一级缓存中查找,如果都没有就在DB中获取:会话关闭后才会同步到二级缓存,没有关闭的情况下是不会同步到二级缓存中的: 二.二级缓存开启方式: 在接口中添加@CacheNamespace注解即可,注意:这里有个坑,在接口文件中添加注解,与XML配置文件中添加属性是不一…
数据库中数据虽多,但访问频率却不同,有的数据1s内就会有多次访问,而有些数据几天都没人查询,这时候就可以将访问频率高的数据放到缓存中,就不用去数据库里取了,提高了效率还节约了数据库资源 MyBatis有两种缓存,分为一级和二级缓存. 一级缓存作用域为SqlSession,同一个SqlSession才能访问到,采用HashMap存储数据,当该SqlSession进行了DML操作或者调用close()方法,其中的一级缓存就会清空.一级缓存默认开启. 二级缓存的作用域是mapper映射配置文件,多个S…
一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对象中. 如果同一个SqlSession中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当Map缓存对象中已经存在改键值时,则会返回缓存中的对象.(一个SqlSession连续两次查询 得到的是同一个java对象) 任何的insert update delete操作都会清空一级缓存(增删改任…
问题背景 项目开发中有一个树形数据结构,不像经典组织结构树.菜单级别树,我们这个树形结构是用户后期手动建立起来的关系.因此数据库表结构为两张表:数据记录表.记录关系表,通过业务规则限制,形成的树形结构像下面这样: 特殊之处就是树结构节点是有重复的 不复制重复节点 复制重复节点 项目要求前端展示.导出时使用复制重复节点的方式.开搞吧 Mybatis树结构查询 树结构查询,在mysql下当然是使用Mybatis框架提供的递归查询了. xml配置文件 <resultMap type="(...)…
MyBatis一级缓存 MyBatis一级缓存默认开启,一级缓存为Session级别的缓存,在执行以下操作时一级缓存会清空 1.执行session.clearCache(); 2.执行CUD操作 3.session.close(); //不是同一个Session对象了 MyBatis二级缓存 需要配置<cache></cache> 是一个映射文件级的缓存 使用Mybatis二级缓存时查询的对象实体类必须序列化实现(实现Serializable接口) 二级缓存使用时 必须使用sess…
MyBatis一级缓存引起的无穷递归 引言: 最近在项目中参与了一个领取优惠劵的活动,当多个用户领取同一张优惠劵的时候,使用了数据库锁控制并发,起初的设想是:如果多个人同时领一张劵,第一个到达的人领取成功,其它的人继续查找是否还有剩余的劵,如果有,继续领取,否则领取失败.在实现中,我一开始使用了递归的方式去查找劵,实际的测试中发现出现了无穷递归,通过degug和查阅资料才发现这是由于mybatis的一级缓存引起的,以下将这次遇到的问题和大家分享讨论. 1.涉及到的知识点 Mybatis缓存: 一…
mybatis缓存分为一级缓存,二级缓存和自定义缓存.本文重点讲解一级缓存 一:前言 在介绍缓存之前,先了解下mybatis的几个核心概念: * SqlSession:代表和数据库的一次会话,向用户提供了操作数据库的方法 * MapperedStatement:代表要往数据库发送的要执行的指令,可以理解为sql的抽象表示 * Executor:用来和数据库交互的执行器,接收MapperedStatement作为参数 二:一级缓存 1.一级缓存的介绍: mybatis一级缓存有两种:一种是SESS…
MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选: package org.apache.ibatis.session; /** * @author Eduardo Macarron */ public enum LocalCacheScope { SESSION, //session 级别的缓存 STATEMENT //statement 级别的缓存 } 1)session 级别的缓存 在同一个 sqlSession 内,对同样的查询将不再…
场景: 由于在一个方法中存在多个不同业务操作 private void insertOrUpdateField(CompanyReport entity) { //计算并数据 calcReportData(entity); // 对比上季度或上年度数据,生成风险警示 raiseReportRisk(entity.getId()); // 检测并级联产生年度数据,并对比年度数据,生成风险警示 checkAndGenerateYearData(entity.getId()); } private v…