简介

1.什么是缓存
将一次查询的结果暂时存储到一个可以直接取的地方。
2.原因:

  • 多次连接数据库查询,浪费资源(减少系统开销,提高效率)
  • 解决高并发的问题
    3.什么样的数据适合缓存:
    经常查询,不经常更改的数据

Mybatis缓存

1.Mybatis包含一个非常强大的查询缓存特性,可以非常方便的定制和配置缓存,缓存可以极大的提高查询效率
2.执行select时使用缓存,一旦执行了update,insert,delete语句缓存刷新(会改变原来的数据)
3.sqlsession.clearCache();
4.Mybatis中定义了,两种缓存等级:

  • 一级缓存(自动开启):SqlSession的开启与SqlSession.close这个期间有效,为一级缓存
    MySQL-缓存_数据
    (缓存的生命周期)示例:没有关闭SQLSession只进行了一次查询
    MySQL-缓存_一级缓存_02
    关闭了SQLSession之后,进行了两次查询
    MySQL-缓存_sql_03
    MySQL-缓存_一级缓存_04
  • 二级缓存(需要手动开启):
    也叫全局缓存,由于一级缓存作用域过低一个,所以诞生了二级缓存
    基于namespace级别的缓存,一个命名空间中有效(例如:UserMapper.class中有效)
    工作机制:
    一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
    若当前会话关闭,一级缓存消失,(希望的是:一级缓存消失,数据存储到二级缓存中)
    新的会话查询信息直接从二级缓存中获取
    不存的namespace会有自己的缓存空间
    MySQL-缓存_数据_05
    1.开启配置(开启全局缓存)
    mybatis-config.xml
    <setting name="cacheEnabled" value="true"/>
    
    UserMapper.xml
    2.配置缓存设置
    <!--FIFO:先进先出的缓存规则
    60000:60秒刷新
    -->
    <cache
        eviction="FIFO"
        flushInterval="60000"
        size="512"
        readOnly="true"
    />
    
    注意:启用二级缓存时需要开启对象序列化(将实体类序列化)
    错误信息:org.apache.ibatis.cache.CacheException: Error serializing object. Cause: java.io.NotSerializableException: com.test.pojo.UserPojo

    MySQL-缓存_sql_06

缓存原理

MySQL-缓存_sql_07