一级缓存
-
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.