一、什么是缓存(Cache),缓存有什么作用
(1)存在内存中的临时数据。
(2)将用户经常查询的数据放在缓存(内存)中,用户查询数据时就不需要在从磁盘上(关系型数据库数据文件)查询,直接从缓存中查询;从而提高了查询效率,解决了高并发系统的性能问题。
(3)什么样的数据能使用缓存:经常查询且不经常改变的数据。
作用:减少了和数据库的交互次数,减少了系统的开销,提高了系统效率;
二、Mybatis的缓存
(1) MyBatis 包含一个非常强大的查询缓存特性,它可以非常方便地定制和配置缓存。缓存可以极大的提升查询效率。
(2)MyBatis 系统中默认定义了两级缓存:一级缓存和二级缓存
a、默认情况下,只有一级缓存开启。( SqlSession 级别的缓存,也称为本地缓存)。
b、二级缓存需要手动开启和配置,他是基于 namespace 级别的缓存。
c、为了提高扩展性, MyBatis 定义了缓存接口 Cache ,我们可以通过实现 Cache 接口来自定义二级缓存。
三、一级缓存
缓存失效的情况:
1、查询不同的东西
2、增删改操作,改变了原来的数据
3、查询了不同的Mapper.xml
4、手动清理了缓存
手动清理缓存:
sqlSession.clearCache();
小结:一级缓存默认开启的,只在一次sqlSession中有效,也就是拿到连接和关闭连接这个区间中有效,一级缓存就是一个Map。
四、二级缓存
(1)二级缓存也叫全局缓存,一级缓存作用城太低了,所以诞生了二级缓存
(2)基于 namespace 级别的缓存,一个名称空间,对应一个二级缓存;
(3)工作机制:
a、一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中;
b、如果当前会话关闭了,这个会话对应的一级缓存就没了:但是我们想要的是,会话关闭了,一c级缓存中的数据被保存到二级缓存中;
d、新的会话查询信息,就可以从二级缓存中获取内容;
e、不同的 mapper 查出的数据会放在自己对应的缓存( map )中;
实现二级缓存的步骤;:
(1)开启全局缓存:
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
(2)Mapper中开启二级缓存
直接开启:
<cache/>
自定义参数:
<cache eviction="FIFO"
flushInterval="60000"
size="512"
readOnly="true"
/>
小结:
(1)只要开启二级缓存在同一个Mapper下就有效
(2)所有的数据会先放在一级缓存中
(3)只有当会话提交时,或者关闭时,才会提交到二级缓存中
五、自定义缓存--ehcache
Ehcache是一种广泛使用的开源Java分布式缓存,主要面向通用缓存
(1)使用时要导包:
<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.2.1</version>
</dependency>
(2)Mapper中:
<cache type="org.mybatis.caches.ehcacheCache"/>
(3)配置缓存:
<defaultCache
maxElementsInMemory="10000"
//缓存中最大允许创建的对象数
eternal="false"
//缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期
timeToIdleSeconds="120"
//缓存数据钝化时间(设置对象在它过期之前的空闲时间)
timeToLiveSeconds="120"
//缓存数据的生存时间(设置对象在它过期之前的生存时间)
overflowToDisk="true"
//内存不足时,是否启用磁盘缓存
/>
下面是自己的ehcache.xml 的配置
<ehcache>
<!--
设置缓存文件 .data 的创建路径。
如果该路径是 Java 系统参数,当前虚拟机会重新赋值。
下面的参数这样解释:参考http://www.wityx.com
user.home – 用户主目录
user.dir – 用户当前工作目录
java.io.tmpdir – 默认临时文件路径
-->
<diskStore path="java.io.tmpdir"/>
<!-- 缺省缓存配置。CacheManager 会把这些配置应用到程序中。
下列属性是 defaultCache 必须的:
maxInMemory - 设定内存中创建对象的最大值。
eternal - 设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超时限制且元素永不消亡。
timeToIdleSeconds - 设置某个元素消亡前的停顿时间。
也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。
这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则
设置该属性也无用)。
如果该值是 0 就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds - 为元素设置消亡前的生存时间。
也就是一个元素从构建到消亡的最大时间间隔值。
这只能在元素不是永久驻留时有效。
overflowToDisk - 设置当内存中 缓存达到 maxInMemory 限制时元素是否可写到磁盘
上。
-->
<defaultCache name="com.cader.MethodCache"
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
/>
</ehcache>