Mybatis中一级缓存和二级缓存的区别

一级缓存

  • mybatis默认是一级缓存
    一级缓存指的就是Session缓存,也就是在同一个SqlSession中,不同的sqlSession中的缓存是互相不能读取的。

    第一次在database中查询会保存在缓存中,第二次或者n次都是在缓存中获取

  • 优点:sqlSession先去缓存中查找,是否有该数据,如果有,读取; 如果没有,从数据库中查询,并将查询到的数据放入一级缓存区域,供下次查找使用。
    但sqlSession执行commit,即增删改操作时会清空缓存。这么做的目的是避免脏读。

     脏读:读取错误,读取数据不正确
     不可重复读:多次读取,内容不一致
     幻读:多次读取,数据总量不一致
    
  • 弊端:查询次数多效率不高

  • 例:(如果commit不清空缓存,会有以下场景:A查询了某商品库存为10件,并将10件库存的数据存入缓存中,之后被客户买走了10件,数据被delete了,
    但是下次查询这件商品时,并不从数据库中查询,而是从缓存中查询,就会出现错误。)

mybatis的二级缓存

Mybatis的二级缓存是指mapper映射文件。二级缓存的作用域是同一个namespace下的mapper映射文件内容,二级缓存是在多个一级缓存建立,所以只要设置mapper中的标签属性useCache,他们就都存在一个缓存中,多个SqlSession共享。(MyBatis要求返回的POJO必须是可序列化的。)

  • 查询多于修改时使用二级缓存
    在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。

(二级缓存在config配置中是默认开启的,配置mapper的userCache就会将该语句设置成二级缓存)
配置二级缓存的步骤:

		1 要将缓存的pojo类实现序列化接口
		2 在mybatis-config.xml的全局配置文件中开启二级缓存
		3 在对应的mapper.xml文件中<cache></cache>
		4 找到需要缓存的statement,<select useCache="true">

优点:

  • 采用mybatis二级缓存技术降低数据库访问量,提高访问速度。

弊端:

  • 会产生脏读。对关联表的查询,关联的所有表的操作都必须在同一个namespace(interface)。

    例:(订单和订单详情,orderMapper、orderDetailMapper。在查询订单详情时我们需要把订单信息也查询出来,那么这个订单详情的信息被二级缓存在orderDetailMapper的namespace中,
    这个时候有人要修改订单的基本信息,那就是在orderMapper的namespace下修改,他是不会影响到orderDetailMapper的缓存的,
    那么你再次查找订单详情时,拿到的是缓存的数据,这个数据其实已经是过时的。)

用了很长时间的CSDN,一直到现在才开始发表自己的博客论文,希望在这个过程中和大家一起成长吧,分享一下,希望可以帮助到你们,有的地方也不是特别的完整和完善,也希望大家可以共勉

插入链接与图片

链接: link.
Alt

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值