【Java】MyBatis缓存机制

1.一级缓存|二级缓存
  1. 一级缓存:
  • 是指当使用SqlSession从数据库中取数据时,Executor会在优先查找本地缓存中的数据,如果命中缓存,则直接返回本地缓冲区中的数据,否则会从数据库中进行查找,查找结果缓存到本地的同时,发送给SqlSession。
  • 当第二次查询SQL语句相同时,会直接从本地缓存中拿取数据。session级别的一级缓存是靠PerpetualCache(内部原理HashMap<K, V>)实现的。
  1. 二级缓存:
  • 二级缓存利用设计模式中的装饰者模式得到一个CachingExecutor,CachingExecutor是Executor的实现类。其拿取数据流程和一级缓存类似。
  • 不同的是二级缓存是应用级别的缓存,如果缓存数据较多的话,它可以将缓存内容存放至第三方数据库中,如MemCached、Redis等。

在这里插入图片描述

2.一级缓存性能分析
  • MyBatis对会话(Session)级别的一级缓存设计的比较简单,就简单地使用了HashMap来维护,并没有对HashMap的容量和大小进行限制。
  • 一级缓存是一个粗粒度的缓存,没有更新缓存和缓存过期的概念。
3.MyBatis缓存级别
  • MyBatis一级缓存有两种级别:SESSION级别、STATEMENT级别
  • MyBatis二级缓存级别是mapper级别的缓存,不同的mapper通常情况下有不同的namespace,也就都对应一个二级缓存。不同的mapper之间不会互相影响。需要注意的是,如果缓存的内容是查询数据库的结果,则当进行下一次增删改操作时,缓存会被刷新,从而保证数据的一致性。
4.一级缓存的使用
  1. 开启一级缓存
  • SESSION级别:
    <settings>
        <setting name="localCacheScope" value="SESSION"/>
    </settings>
  • STATEMENT级别:
    <settings>
        <setting name="localCacheScope" value="STATEMENT"/>
    </settings>

	<select id="selectAll" resultMap="BaseResult" useCache="true">
        select * from tb_user
    </select>

    <!-- 
		useCache - 使用缓存
		flushCache - 执行完是否清除缓存
     -->
  1. 执行后打印的日志结果
    在这里插入图片描述
5.二级缓存的使用
  1. 设置cacheEnabled,开启二级缓存
    <settings>
        <!--配置一级缓存(默认开启),共有两个选项,SESSION或者STATEMENT,默认是SESSION级别,
            即在一个MyBatis会话中执行的所有语句,都会共享这一个缓存。一种是STATEMENT级别,
            可以理解为缓存只对当前执行的这一个Statement有效。-->
        <setting name="localCacheScope" value="SESSION"/>
        <!-- 指定所用日志的具体实现,未指定时将自动查找 [STDOUT_LOGGING]-MyBatis日志 -->
        <setting name="logImpl" value="LOG4J"/>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>
  1. mapper中开启默认缓存,只需写上cache标签即可。
    <mapper>
        <!--配置默认缓存-->
   		 <cache></cache>
   </mapper>
  1. 查看结果
    在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值