栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis 缓存

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis 缓存

MyBatis 缓存

文章目录


Tips
  1. 目前流行的缓存服务器有 MongoDB、Redis、Ehcache 等

  2. 默认情况下,MyBatis 只开启一级缓存

  3. 对于 MyBatis 缓存仅作了解即可,因为面对一定规模的数据量,内置的 Cache 方式就派不上用场了,并且对查询结果集做缓存并不是 MyBatis 所擅长的,它专心做的应该是 SQL 映射。

  4. 对于缓存,采用 OSCache、Memcached 等专门的缓存服务器来做更为合理。

一级缓存
  1. 一级缓存是基于 PerpetualCache(MyBatis自带)的 HashMap 本地缓存,作用范围为 session 域内

  2. 一级缓存缓存的是 SQL 语句,通过同一个SqlSession查询的数据会被缓存,下次查询相同的数据,就 会从缓存中直接获取,不会从数据库重新访问

  3. 使一级缓存失效的四种情况

    ​ ① 不同的SqlSession对应不同的一级缓存

    ​ ② 同一个SqlSession但是查询条件不同

    ​ ③ 同一个SqlSession两次查询期间执行了任何一次增删改操作

    ​ ④ 同一个SqlSession两次查询期间手动清空了缓存

  4. 在参数和 SQL 完全一样的情况下,同一个 SqlSession 对象调用同一个 mapper 的方法只执行一次 SQL

    再次查询时,如果没有刷新,且缓存没有超时,那么这个SqlSession 都是从缓存中读取数据,不会再次发送SQL

  5. 由于 SqlSession 是相互隔离的,所以如果你使用不同的 SqlSession 对象,即使调用相同的 Mapper、参数和方法,MyBatis 还是会再次发送 SQL 到数据库执行,返回结果。

public class Test {
    public static Logger logger = Logger.getLogger(Test.class);
    public static void main(String[] args) throws IOException {
        InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建
        SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config);
        
        //执行sql语句
        logger.debug("名为ss的SqlSeesion,执行第一次");
        SqlSession ss = ssf.openSession();
        Website site = ss.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1);
        
        
        //从缓存中读取上一次执行过的结果
        logger.debug("名为ss的SqlSeesion,执行第二次");
        Website site2 = ss.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1);
        // 请注意,当我们使用二级缓存的时候,sqlSession调用了 commit方法后才会生效
        ss.commit();
        
        
        //执行sql语句
        logger.debug("名为ss2的SqlSeesion,执行第一次");
        SqlSession ss2 = ssf.openSession();
        Website site3 = ss2.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1);
        // 请注意,当我们使用二级缓存的时候,sqlSession调用了 commit方法后才会生效
        ss2.commit();
    }
}

DEBUG [main] - ==> Preparing: SELECT * FROM website WHERe id=?
DEBUG [main] - > Parameters: 1(Integer)
DEBUG [main] - <
Total: 1
DEBUG [main] - 使用同一个sqlsession再执行一次
DEBUG [main] - 现在创建一个新的SqlSeesion对象在执行一次
DEBUG [main] - ==> Preparing: SELECt * FROM website WHERe id=?
DEBUG [main] - > Parameters: 1(Integer)
DEBUG [main] - <
Total: 1

二级缓存
  1. 二级缓存是SqlSessionFactory级别,通过同一个SqlSessionFactory创建的SqlSession查询的结果会被缓存

    缓存的是结果对象,此后若再次执行相同的查询语句,结果就会从缓存中获取

  2. 借一级缓存的例,设置二级缓存之后,ss2也不会执行sql

  3. 二级缓存开启的条件

    ​ ① 在核心配置文件中,设置全局配置属性cacheEnabled=“true”,默认为true,不需要设置

    ​ ② 在映射文件中设置标签

    ​ ③ 二级缓存必须在SqlSession关闭或提交之后有效

    ​ ④ 查询的数据所转换的实体类类型必须实现序列化的接口

  4. 二级缓存失效的情况: 两次查询之间执行了任意的增删改,会使一级和二级缓存同时失效

配置


    



    
    
    ...

属性说明
eviction缓存回收策略,目前 MyBatis 提供以下策略,默认的是 LRU。

LRU:使用较少,移除最长时间不用的对象
FIFO:先进先出,按对象进入缓存的顺序来移除它们
SOFT:软引用,移除基于垃圾回收器状态和软引用规则的对象
WEAK:弱引用,更积极地移除基于垃圾收集器状态和弱引用规则的对象。
flushInterval刷新间隔时间,单位为毫秒,这里配置的是 100 秒刷新,默认情况是不设置,也就是没有刷新间隔,只有当 SQL 被执行的时候才会刷新缓存。
size引用数目,正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。这里配置的是 1024 个对象。
readOnly只读,默认值为 false
true:只读缓存;会给所有调用者返回缓存对象的相同实例。因此这些对象不能被修改。这提供了 很重要的性能优势
false:读写缓存;会返回缓存对象的拷贝(通过序列化)。这会慢一些,而且无法修改缓存,但是安全,因此默认是 fals


缓存查询的顺序
  1. 先查询二级缓存,因为二级缓存中可能会有其他程序已经查出来的数据,可以拿来直接使用。
  2. 如果二级缓存没有命中,再查询一级缓存
  3. 如果一级缓存也没有命中,则查询数据库
  4. SqlSession关闭之后,一级缓存中的数据会写入二级缓存
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/865160.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号