Mybatis二级缓存

【ssm_kaoshi_person项目,ssm_layui_smbms项目】

  1. 一级缓存(也称为本地缓存)、二级缓存(也称为全局缓存)的缓存粒度都是整个结果集,而非结果集中的单条记录。
  2. 一级缓存、二级缓存都是使用map存储数据。
  3. 一级缓存存在时间短,没有设置map的容量限制。
  4. 二级缓存存在时间长,可在mapper.xml中定义<cache />标签来指定map的容量和清除策略。二级缓存和应用共存,但是调用mapper的增删改方法时可能会刷新缓存(通过设置flushCache属性为true/false来控制)、且二级缓存达到容量限制时会自动清除部分数据。
  5. 一级缓存默认开启,生命周期很短,一般不存在数据读写问题,但基本没啥用(仅在使用事务时有用)
  6. 二级缓存默认关闭,生命周期很长,容易产生脏读问题,不建议使用。

MyBatis一级缓存:

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

《一级缓存的命中条件》

方法id相同:调用的要是同一个mapper中的同一个方法
查询参数相同:传给sql语句的参数值要全部相同
select * from tb_user where id=?
不管是直接传入int型的id、Integer型的id,还是通过实体类User、Map传入的id,只要最终传给sql语句的值完全相同就行。请注意是相同,10、10.0是相等但不相同是不符合的。

分页参数要相同。实质是保证执行的sql语句完全相同

《一级缓存的生命周期》

spring整合mybatis

未使用事务时:每个mapper方法被调用时都是打开了一个新的sqlSession,方法调用结束sqlSession被关闭。不管mapper方法调用结果如何,方法调用结束时一级缓存即被清空
使用事务时会把这个事务中的所有mapper方法调用放在一个事务中,这些mapper方法使用同一个sqlSession,在此事务的生命周期中一直有效。不管事务执行结果如何(提交成功、回滚),只要事务结束一级缓存即被清空
 
sqlSession调用selectXxx()方法得到结果集时写入缓存。

一级缓存被清除的几种情况:

调用sqlSession.clearCache()清除缓存,
调用sqlSession.close()关闭sqlsession,
调用sqlSession.commit()提交事务或sqlSession.rollback()回滚事务。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/chy_18883701161/article/details/110943757

MyBatis二级缓存:

MyBatis的二级缓存是application级别的缓存,只要应用不结束,二级缓存都会存在在内存中。二级缓存是基于mapper级别/namespac级别的,在同一个Mapper下有效。二级缓存是跨SqlSession的多个SqlSession去操作同一个Mapper中同一个sql语句并且参数相同,可以共用二级缓存,从而提高查询效率。

二级缓存的命中条件

二级缓存和一级缓存的命中条件相同(即方法id相同、查询参数相同),区别是二级缓存的命中范围更广:在同一个sqlSessionFactory的生命周期内。

二级缓存的生命周期

写入时机:sqlSession.selectXxx()查询生成一级缓存后,再执行sqlSession.close()或sqlSession.commit(),即将要清空一级缓存时,会把一级缓存内容写入二级缓存。
清空时机:二级缓存和应用共存,但是调用mapper的增删改方法时可能会刷新缓存(通过设置flushCache属性为true/false来控制)、且二级缓存达到容量限制时会自动清除部分数据。
————————————————

版权声明:本文为博主原创文章,遵循 CC 4.0 BY 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/chy_18883701161/article/details/110943757

1.
mybatis.xml中:
      ① <!--mybatis二级缓存 开启-->
        <setting name="cacheEnabled" value="true"/>
      ② 实现二级缓存的时候,MyBatis要求返回的要存入二级缓存的POJO必须是可序列化的,也就是要求实现Serializable接口:
        ArrayList底层实现了Serializable接口,所以返回对象集合的查询不需要使对应的实体类实现Serializable接口,而返回单个对象的查询如果开启了缓存又没有设置缓存禁用,则对象实体类必须实现Serializable接口。
2.
mapper.xml中:在要使用二级缓存的Mapper.xml文件中添加cache标签

        <!--启用当前mapper文件中所有select标签的二级缓存。回收策略为先进先出,每隔60秒刷                 新一次,最多缓存512个引用对象,只读-->
        <cache  
eviction="FIFO" flushInterval="60000"  size="512" readOnly="true"/>

默认的清除策略是 LRU(移除最近最少使用的对象)、还有FIFO、SOFT(基于GC和软引用规则移除对象)、WEAK(基于GC和弱引用规则移除对象)。

3.
select,insert,update,delete标签中的缓存属性。看zybuluo笔记。
        <!--useCache=false,禁用二级缓存(可设置给不需要缓存的select查询,如登录对象的验证查询)-->
        <!--flushCache=true ,修改后刷新缓存 [若通过数据库手动修改则不刷新] ,一般用于insert,update,delete-->

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值