Mybatis缓存

    为了提升查询效率和减少数据库的查询压力,mybatis提供了一级和二级缓存。
    mybatis的缓存是在Cache接口中,它只有一个默认的实现类PerpetualCache,用HashMap实现,剩下的都是装饰类

一级缓存

    一级缓存是在sqlSession层面的,所以在参数和sql完全一样的情况下查询才会走一级缓存。默认开启,不需要任何的配置。
    存放位置sqlSession实现类DefaultSqlSession中的Executor属性,存放了缓存,Executor的实现类BaseExecutor中的PerpetualCache localCache;
    失效:同一个会话中,update(包括delete)会导致一级缓存失效。如果其它会话更新了数据,那么会读取到脏数据。

二级缓存    

    可以解决一级缓存不能跨会话共享的问题。范围是namespace级别,只要是同一个namespace可以被多个session共享。生命周期和应用同步。
    开启方法:
        第一步:<setting name="cacheEnabled" value="true"/> 在主配置文件中配置cacheEnabled属性,默认为true。
        第二步:在Mapper中配置<cache/>标签。配置了之后,select会被缓存,update,delete,insert会刷新缓存。
        <select id="selectBlog" resultMap="BaseResultMap" useCache="false">  useCache="false" 关闭当前statementid二级缓存
   存放位置: 存储在Executor的装饰类CachingExecutor中(TransactionalCache真正持有了cache对象),其实CachingExecutor是对BaseExecutor的装饰。取数据时,先看二级缓存有没有命中,在查看一级缓存。
    执行流程

什么时候开启二级缓存

    1,因为所有的增删改都会刷新二级缓存,所以建议在以查询为主的引用中使用。例如交易查询,订单查询,否则缓存就失去了意义。
    2,如果有两个namespace对同一张表进行了操作,那么可能导致脏数据。<cache-ref>标签可以解决跨namespace缓存共享的问题。
    <cache-ref namespace="com.gupaoedu.crud.dao.DepartmentMapper" />,这种情况下,多个Mapper的操作都会引起缓存的刷新,缓存的意义已经不大了。







posted @ 2020-05-11 16:01  gnice512  阅读(171)  评论(0编辑  收藏  举报