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"/>

浙公网安备 33010602011771号