Mybatis缓存1----系统缓存及简单配置介绍

Posted shar-wang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis缓存1----系统缓存及简单配置介绍相关的知识,希望对你有一定的参考价值。

 

mybatis缓存

  系统缓存:常用的一级缓存和二级缓存

一级缓存

  一级缓存是SqlSession级别的缓存,在操作数据库时需要构建SqlSession对象,在对象中有一个数据结构用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。也就是只能作用在一个SqlSession对象中,不同SqlSession之间的缓存数据是互相不能读取的。

   一级缓存的工作原理

  技术图片

 

 

   口述介绍:

  当用户A发起请求查询一条记录时,SqlSession会先从缓存中读取数据,如果存在就读取,如果不存在就从数据库获取数据。

  SqlSession执行commit操作时,会清空一级缓存。这么做是为了避免脏读。

  

  注:如果commit不清空缓存,会出现错误。例如:当用户A查询某件商品还有10件,并将10件商品缓存在一级缓存中,之后被客户买走10件,数据被delete掉,但下次查询这件商品是从缓存中获取。就会出现脏数据

  spring中整合的mybatis

  spring将事务放在Service中管理,对于每一个service中的SqlSession是不同的,这是通过mybatis-spring中的org.spring.mapper.MapperScannerConfigurer创建SqlSession自动注入到Service中的,每次查询之后都要关闭SqlSession,关闭之后数据会被清空,所以spring整合之后如果没有事务支持,一级缓存是没有意义的。

 

  二级缓存

    二级缓存的工作原理

  技术图片

 

 

     口述介绍:

    二级缓存是mapper级别的缓存,多个sql‘Session去操作同一个mapper的sql语句,多个SqlSession可共用同一个二级缓存,二级缓存是跨SqlSession的。

   每一个mapper都有一个二级缓存区域(按照namespace区分),每一个namespace的mapper都有二级缓存区域,两个mapper的namespace相同,这两个mapper执行的Sql查询数据存储在同一个二级缓存区域。

    

   开启二级缓存

    1.打开总开关:

    在mybatis的xml文件中加入:

    <settings>

      <setting name="cacheEnabled" value="true"/>

    <settings/>

    2.在需要开启二级缓存的mapper.xml文件中引入<cache />

    3.让使用二级缓存的POJO类实现Serializable(序列化)接口

    注:springboot中默认开启了全局二级缓存,如果使用二级缓存需要在mapper上注明。@CacheNamespace

 

    总结:

    好处:对于查询多,commit操作少的。用户对查询条件实时性数据要求不高,采用二级缓存可以降低数据库访问量,提高数据库访问性能。

    弊端:二级缓存是建立在一个namespace下的,如果是多个namespace那么数据可能是错误的。

      

     举例说明:

    部门和部门员工,部门存储在部门的二级缓存下,部门员工存储在部门员工的二级缓存下。如果有人对部门信息进行修改,那么影响的就只有部门的二级缓存,如果在进行查询时,部门员工信息时从部门员工的二级缓存中获取的。这时候的数据是已经过时的。

 

    使用二级缓存的问题:

    对该表的操作都是同一个namespace下,其他namespace如果有操作就会发生脏读。

    对关联表的操作,关联表的所有表的操作都必须在同一个namespace下操作。

以上是关于Mybatis缓存1----系统缓存及简单配置介绍的主要内容,如果未能解决你的问题,请参考以下文章

《深入理解mybatis原理6》 MyBatis的一级缓存实现详解 及使用注意事项

mybatis 之缓存机制

ehcache缓存实战

MyBatis源码分析:MyBatis Cache分析

MyBatis官方教程及源代码解析——mapper映射文件

干货分享|精讲 MyBatis 缓存机制(下)