MyBatis二级缓存+spring cache @Cacheable、@CacheConfig

一、MyBatis二级缓存

1、什么是缓存
缓存就是内存中的一个对象,用于对数据库查询结果的保存,用于减少与数据库的交互次数从而降低数据库的压力,进而提高响应速度。

2、什么是MyBatis中的缓存
MyBatis 在执行一次SQL查询或者SQL更新之后,这条SQL语句并不会消失,而是被MyBatis 缓存起来,当再次执行相同SQL语句的时候,就会直接从缓存中进行提取,而不是再次执行SQL命令。


MyBatis中的缓存分为一级缓存和二级缓存,一级缓存又被称为 SqlSession 级别的缓存,二级缓存又被称为表级缓存。

SqlSession是什么?(SqlSession 是SqlSessionFactory会话工厂创建出来的一个会话的对象,这个SqlSession对象用于执行具体的SQL语句并返回给用户请求的结果。)

SqlSession级别的缓存是什么意思?(SqlSession级别的缓存表示的就是每当执行一条SQL语句后,默认就会把该SQL语句缓存起来,也被称为会话缓存。)


MyBatis 一级缓存最大的共享范围就是一个SqlSession内部,那么如果多个 SqlSession 需要共享缓存,则需要开启二级缓存。
当二级缓存开启后,同一个命名空间(namespace) 所有的操作语句,都影响着一个共同的 cache,也就是二级缓存被多个 SqlSession 共享,是一个全局的变量。当开启缓存后,数据的查询执行的流程就是
(二级缓存 -> 一级缓存 -> 数据库)。


如果要实现 mybatis 的二级缓存,一般来说有如下两种方式:

  1. 采用 mybatis 内置的 cache 机制。
  2. 采用三方 cache 框架, 比如ehcache, oscache 等等.

3、开启二级缓存
① Mybatis配置文件加:

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

② 各个mapper.xml文件加:

<cache/>

当然也可以指定命名空间,这样同一个命名空间的缓存就是共享,不同的xml之间也是共享:

<cache-ref namespace="xxx"/>

③ 加了标签这个xml的所有语句就有了缓存,如果需要设置useCache="false"区别对待就:

<select id="xxx" useCache=false>  
    select XXX from xxx
</select>

④ 如果数据更新了,查出来的还是缓存里面的数据怎么办?在增删改的语句上加flushCache="true"来刷新缓存:

   <insert id="insert" flushCache="true" >

4、注意:
1.所有在映射文件里的 select 语句都将被缓存。
2.所有在映射文件里 insert,update 和 delete 语句会清空缓存。
3.缓存使用“最近很少使用”算法来回收
4.缓存不会被设定的时间所清空。
5.每个缓存可以存储 1024 个列表或对象的引用(不管查询出来的结果是什么) 。
6.缓存将作为“读/写”缓存,意味着获取的对象不是共享的且对调用者是安全的。不会有其它的调用者或线程潜在修改。
缓存元素的所有特性都可以通过属性来修改

5、最后
二级缓存意义不大
a、面对一定规模的数据量,内置的cache方式就派不上用场了;
b、对查询结果集做缓存并不是MyBatis框架擅长的,它专心做的应该是sql mapper。采用此框架的Application去构建缓存更合理,比如采用OSCache、Memcached啥的。

参考:MyBatis一级缓存详解,MyBatis 二级缓存全详解,MyBatis的缓存配置(Cache) ,MyBatis自带的缓存配置(Cache)

二、spring cache @Cacheable、@CacheConfig

@Cacheable 注解在方法上,表示该方法的返回结果是可以缓存的。也就是说,该方法的返回结果会放在缓存中,以便于以后使用相同的参数调用该方法时,会返回缓存中的值,而不会实际执行该方法。

@Cacheable 是一个既可以应用于方法级别,也可用于类级别的注解。自spring3.1开始就通过它实现了缓存管理。

其核心思想是,当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存在缓存中。

@CacheConfig(cacheNames="xxx")用于标注在类上,可以存放该类中所有缓存的公有属性,比如设置缓存的名字。


1、使用方法:
①开启基于注解的缓存,使用 @EnableCaching 标识在 SpringBoot 的主启动类上:

@SpringBootApplication
@EnableCaching
public class XXXApplication {
    public static void main(String[] args) {
        SpringApplication.run(XXXApplication .class, args);
    }
}

②在方法上加注解@Cacheable

    @Cacheable(key = "#id")
    public List<String> getXxx(Integer id) {
        return XXX;
    }

注解属性说明:

cacheNames/value :用来指定缓存组件的名字

key :缓存数据时使用的key,可以用它来指定。默认是使用方法参数的值。
(这个key可以使用spEL表达式编写Spring Expression Language,Spring 表达式语言)

keyGenerator :key 的生成器。 key 和 keyGenerator 二选一使用。官方推荐key

cacheManager :可以用来指定缓存管理器。从哪个缓存管理器里面获取缓存。

condition :可以用来指定符合条件的情况下才缓存,支持 SpEL

unless :否定缓存。当 unless 指定的条件为 true ,方法的返回值就不会被缓存。
当然你也可以获取到结果进行判断。(通过 #result 获取方法结果)

sync :是否使用异步模式。

这个缓存也可以通过配置缓存容器的时候设置过期时间等。但建议还是比如码表一类不经常改动的数据来使用。需要定期更新缓存那种的还是用其他办法。

参考:Spring 缓存——@Cacheable,SpringBoot 缓存之 @Cacheable 详细介绍,spring cache 学习 —— @Cacheable 使用详解

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