Mybatis入门(十一) mybati缓存简介

什么是缓存?

缓存是指存在内存中的数据,将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上查询,而是走缓存

为什么要用缓存?

每次查询都要连接数据库十分耗资源,缓存可以减少和数据库的交互次数,减少开销,提高效率,解决了高并发系统的性能问题

什么样的数据可以进行缓存?

经常查询且不经常改变的数据

 

MyBatis缓存

mybatis内置了一个非常强大的缓存特性,其中包含一级缓存和二级缓存

一级缓存:

一级缓存mybatis默认开启,无法关闭,是一次会话(sqlsession)的缓存,又称本地缓存。

同一次会话中查询的数据会保留到缓存,当再次获取同样的数据时,直接从缓存中获取,而不走数据库,debug测试如下:

图1表示一次会话中进行两次相同的查询,图二为debug调试查看,第二次直接走缓存

 

 

 

 

 

 

二级缓存

二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存
基于namespace级别的缓存,也就是一个mapper文件,一个名称空间,对应一个二级缓存

工作机制

  • 一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
  • 如果会话关闭了,这个会员对应的一级缓存就没了;但是我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中
  • 新的会话查询信息,就可以从二级缓存中获取内容
  • 不同的mapper查询出的数据会放在自己对应的缓存(map)中

二级缓存需要手动设置,首先在核心配置文件中,有个setting属性(cacheEnabled)配置是否开启二级缓存,默认是开启的,也可以自己在显示的开启,如下图

 

 

 当一级缓存,也就是sqlsession关闭时,才会进行二级缓存的存储,由于是作用在namespace上,所以需要在mapper文件上显性开启,如下图

//在当前Mapper.xml中使用二级缓存-
<cache
       eviction="FIFO"
       flushInterval="60000"
       size="512"
       readOnly="true"/>


//或者可以直接
<cacsh/>

 

缓存失效的情况:

1.查询不同的东西

2.增删改操作,可能会改变原来的数据,所以必定会刷新缓存

3.查询不同的Mapper.xml

4.手动清理缓存

小结:

  • 只要开启了二级缓存,在同一个Mapper下就有效
  • 所有的数据都会放在一级缓存中
  • 只有当前会话提交,或者关闭的时候,才会提交到二级缓存中
  • 只有查询才有缓存,根据数据是否需要缓存(修改是否频繁选择是否开启)useCache=“true”
   //一个查询语句可以指定是否开启 
  <select id="selectBlog" parameterType="map" resultType="blog" useCache="true"> select * from bloghys <where> <if test="title !=null"> and title like concat('%',#{title},'%') </if> </where>

 

 

关于自定义缓存Ehcache ,他是一种广泛使用的开源Java分布式缓存。主要面向通用缓存

需要打包,并且在核心配置文件中指定这个包:

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>



<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

 

posted @ 2021-08-31 13:56  黄易安  阅读(98)  评论(0)    收藏  举报