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文件中
		4 找到需要缓存的statement,