为什么互联网大厂都愿意用 Mybatis? MyBatis 缓存特性你了解吗?

一、缓存简介

一般我们在系统中使用缓存技术是为了提升数据查询的效率。当我们从数据库中查询到一批数据后将其放入到混存中(简单理解就是一块内存区域),下次再查询相同数据的时候就直接从缓存中获取数据就行了。这样少了一步和数据库的交互,可以提升查询的效率。

但是一个硬币都具有两面性,缓存在带来性能提升的同时也“悄悄”引入了很多问题,比如缓存同步、缓存失效、缓存雪崩等等。当然这些问题不是本文讨论的重点。

本文主要讨论 MyBatis 缓存这个比较鸡肋的功能。虽然说 MyBatis 的缓存功能比较鸡肋,但是为了全面了解 MyBatis 这个框架,学习下缓存这个功能还是挺有必要的。MyBatis 的缓存分为一级缓存和二级缓存,下面就分别来介绍下这两个特性。

二、一级缓存

在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的 SQL,MyBatis 提供了一级缓存的方案优化这部分场景,如果是相同的 SQL 语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。

2.1 什么是 MyBatis 一级缓存

一级缓存是 SqlSession 级别 的缓存。在操作数据库时需要构造 sqlSession 对象,在对象中有一个(内存区域)数据结构(HashMap)用于存储缓存数据。不同的 sqlSession 之间的缓存数据区域(HashMap)是互相不影响的。

在应用运行过程中,我们有可能在一次数据库会话中,执行多次查询条件完全相同的 SQL,MyBatis 提供了一级缓存的方案优化这部分场景,如果是相同的 SQL 语句,会优先命中一级缓存,避免直接对数据库进行查询,提高性能。

2.2 怎么开启一级缓存

MyBatis 中一级缓存默认是开启的,不需要我们做额外的操作。

如果你需要关闭一级缓存的话,可以在 Mapper 映射文件中将 flushCache 属性设置为 true,这种做法只会针对单个 SQL 操作生效

<select id="selectByPrimaryKey" parameterType="java.lang.String" resultMap="BaseResultMap" flushCache="true"&gtselect <include refid="Base_Column_List" /> from cbondissuer where OBJECT_ID = #{objectId,jdbcType=VARCHAR} </select>

还有一种做法是在 MyBatis 的主配置文件中,关闭所有的一级缓存

默认是 SESSION,也就是开启一级缓存 <setting name="localCacheScope" value="STATEMENT"/>

下面我们来写代码验证下 MyBatis 的一级缓存。

String id = "123";SqlSession sqlSession1 = sqlSessionFactory.openSession();SqlSession sqlSession2 = sqlSessionFactory.openSession();//同一个sqlSession创建的MapperCbondissuerMapper cbondissuerMapper10 = sqlSession1.getMapper(CbondissuerMapper.class);CbondissuerMapper cbondissuerMapper11 = sqlSession1.getMapper(CbondissuerMapper.class);//另外一个sqlSession创建的MapperCbondissuerMapper cbondissuerMapper20 = sqlSession2.getMapper(CbondissuerMapper.class);
//同一个Mapper,同样的SQL查了两次Cbondissuer cbondissuer10 = cbondissuerMapper10.selectByPrimaryKey(id);Cbondissuer cbondissuer101 = cbondissuerMapper10.selectByPrimaryKey(id);//同一个sqlSession创建的Mapper,又查询了一次同样的SQLCbondissuer cbondissuer11 = cbondissuerMapper11.selectByPrimaryKey(id);//不一样的sqlSession创建的Mapper查询了一次同样的SQLCbondissuer cbondissuer20 &
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值