【SSM】Mybatis的缓存

Mybatis的缓存

  • Mybatis缓存概述及其意义
    • Mybatis 缓存的意义
  • 一级缓存
    • 什么时候不走缓存?
    • 什么时候一级缓存失效?
  • 二级缓存
    • sqlSession没有关闭或提交,二级缓存没数据-测试
    • cache 标签属性配置(二级缓存配置)
  • 查询步骤
  • mybatis 和 ehcache 缓存框架整合

Mybatis缓存概述及其意义

缓存对应的英文单词:cache

mybatis缓存:
将select 语句的查询结果放到缓存(内存)当中,下一次还是这条select 语句的话,直接从缓存中取,不再查数据库,一方面是减少IO,另一方面不再执行繁琐的查找算法,效率大大提升。

mybatis 缓存包括:

  1. 一级缓存:将查询的数据存储到 SqlSession 对象中。
  2. 二级缓存:将查询的数据存储到 SqlSessionFactory 对象中。
  3. 或者集成其他第三方的缓存:比如 EhCache【Java语言开发的】、Memcache【C语言开发的】等。

【SSM】Mybatis的缓存_第1张图片

注意:缓存只针对DQL语句,也就是说缓存机制只对应select 语句。

Mybatis 缓存的意义

  • 将用户经常查询的数据存放在缓存中(内存)中,用户去查询就不用去磁盘中去查询了,从缓存去查询,从而提高查询效率,解决了高并发系统的性能问题;
  • 通过减少IO使用的方式,来提高程序的执行效率。

【SSM】Mybatis的缓存_第2张图片

一级缓存

一级缓存默认情况下是开启的,不需要做任何配置。

原理:只要使用同一SqlSession对象执行同一条SQL语句,就会走缓存。

可以看见两次同一个SqlSession对象执行的同一条DQL语句只执行了一次查询。

【SSM】Mybatis的缓存_第3张图片

【SSM】Mybatis的缓存_第4张图片

什么时候不走缓存?

  1. SqlSession 对象不是同一个;
  2. 查询参数或者查询条件不一样。

什么时候一级缓存失效?

在两次DQL之间做了以下事情就会使得一次缓存清空:

  1. 执行了SqlSessionclearCache() 方法,这是手动清空缓存。
  2. 执行了DML 语句,不管是操作哪张表,都会自动情况缓存。

【SSM】Mybatis的缓存_第5张图片

测试一:

【SSM】Mybatis的缓存_第6张图片

测试二、

【SSM】Mybatis的缓存_第7张图片

【SSM】Mybatis的缓存_第8张图片

二级缓存

二级缓存的范围是SqlSessionFactory。

【SSM】Mybatis的缓存_第9张图片

使用二级缓存需要具备下列几个条件:

  1. < setting name="cacheEnabled" value="true" /> 全局性地开启或关闭所有映射器配置文件中已配置的任何缓存,默认就是true,无需设置。
  2. 在需要使用二级缓存的SqlMapper.xml 文件中添加配置:< cache />。
  3. 使用二级缓存的实体类对象必须是可序列化的,也就是必须实现 java.io.Serializable 接口。
  4. SqlSession 对象关闭或提交之后,一级缓存中的数据才会被写入到二级缓存当中,此时二级缓存才可用。

在这里插入图片描述
【SSM】Mybatis的缓存_第10张图片

在这里插入图片描述

sqlSession没有关闭或提交,二级缓存没数据-测试

【SSM】Mybatis的缓存_第11张图片
【SSM】Mybatis的缓存_第12张图片

修改后二级缓存中有数据:

【SSM】Mybatis的缓存_第13张图片

【SSM】Mybatis的缓存_第14张图片

cache 标签属性配置(二级缓存配置)

  1. eviction:指定从缓存中移除某个对象的淘汰算法,默认采用LRU策略。
  2. flushInterval:二级缓存的刷新时间间隔。单位毫秒,如果没有设置,就代表不刷新缓存,只要内存足够大,一直会向二级缓存中缓存数据,除非执行了DML语句。
  3. readOnly:
  • true:多条相同的sql语句执行之后返回的对象是共享的同一个(内存地址一致),性能好。但是多线程并发可能会存在安全问题。
  • false:多条相同的sql语句执行之后返回的是对象是副本调用了clone方法,性能一般,但安全。
  1. size:设置二级缓存中最多可存储的java对象数量,默认值1024.

查询步骤

每次查询先看二级缓存有没有打开,如果打开了则在二级缓存中查找数据,如果没找到则查看一级缓存有没有打开,如果打开了则在一级缓存中查找数据,如果没找到则从数据库中查询

在这里插入图片描述

mybatis 和 ehcache 缓存框架整合

集成 EhCache 框架是为了代替mybatis 中自带的二级缓存,一级缓存是无法代替的。

mybatis 对外提供了接口,是可以集成第三方缓存组件的。

具体操作看这篇博客:mybatis整合ehcache

你可能感兴趣的:(SSM,mybatis,缓存,java)