1.缓存
官方文档:https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#cache
什么是缓存?
遇事不决先百度。
缓存是指可以进行高速数据交换的存储器。先于内存和CPU交换数据
不过这属于计算机硬件了。我的理解就是用于暂时保存在内存中的数据,不用每次都去磁盘上读取。
2.mybatis的缓存
MyBatis 内置了一个强大的事务性查询缓存机制,它可以非常方便地配置和定制。 使用缓存可以极大的提高查询效率。
Mybatis默认有两个缓存:
- 一级缓存:默认开启。SqlSession缓存,本地缓存。
- 二级缓存:需要手动开启和配置,基于namespace级别的缓存。
- 自定义缓存接口Cache,通过实现Cache接口来自定义二级缓存。
2.1 一级缓存
一级缓存具有的特性:默认开启,无法关闭
- 与数据库同一次会话期间查询到的数据会放在本地缓存中。
- 以后如果需要获取相同的数据,直接从缓存中读取即可,没必要再去查询数据库。
- 在一个SqlSession内起作用。只对读取产生缓存,如果中间修改的话,会刷新缓存。
2.2 二级缓存
二级缓存又叫做全局缓存,一级缓存作用域太低了,所以诞生了二级缓存。
- 基于namespace级别的缓存,一个命名空间对应一个二级缓存。
- 会话查询一条数据,这个数据就会被放在当前会话的一级缓存中。
- 当前会话关闭后,这个会话的一级缓存就消失了,但是一级缓存会被保存在二级缓存中。
- 新的会话查询信息,就可以从二级缓存中获取内容了。
- 不同的mapper查出来的数据会放在自己对应的缓存中。
缓存开启步骤
-
config设置中开启全局缓存(见官方文档的XML配置)
<!--默认是开启的,我们需要做的是,显示开启--> <setting name="cacheEnabled" value="ture"/>
-
开启二级缓存
<cache eviction="FIFO" //清除策略 flushInterval="60000"//刷新时间 size="512" //最大存储对象 readOnly="true"/> //是否只读
-
测试实现
2.3 自定义缓存
2.3.1 手动自定义
官方给出的样例就是手动实现一个缓存的方案。不过需要你自己继承Cache接口。
public interface Cache{
String getId();
void putObject(Object var1,Object var2);
Object getObject(Object var1);
Object removeObject(Object var1);
void clear();
int getSize();
default ReadWriteLock getReadWriteLock(){return null;}
}
不过这个别人有写好的基本操作,总共就这么多,我们可以看看:
不过没什么好看的。
说一下手写自定义缓存的步骤吧:
- 设置中配置缓存类型(官方样例):
<cache type="com.domain.something.MyCustomCache"/>
也可以实现JavaBean属性。
<cache type="com.domain.something.MyCustomCache">
<property name="cacheFile" value="/tmp/my-custom-cache.tmp"/>
</cache>
- 实现接口。
在sql映射中也可以单独设置基于命名空间层的缓存策略:来显式的设置是否更新缓存等配置。
<select ... flushCache="false" useCache="true"/>
<insert ... flushCache="true"/>
<update ... flushCache="true"/>
<delete ... flushCache="true"/>
2.3.2 自定义缓存-ehcache
Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存。
简单介绍一下使用步骤:
- 先导包:去仓库搜一下
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-ehcache -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.0</version>
</dependency>
- 然后配置ehcache的xml,去百度上随便搜点配置就好了。
<!--ehcache.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
<!-- 磁盘保存路径 -->
<diskStore path="E:\Mybatis\ehcache" />
<defaultCache
maxElementsInMemory="1"
maxElementsOnDisk="10000000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
</defaultCache>
</ehcache>
<!--
属性说明:
l diskStore:指定数据在磁盘中的存储位置。
l defaultCache:当借助CacheManager.add("demoCache")创建Cache时,EhCache便会采用<defalutCache/>指定的的管理策略
以下属性是必须的:
l maxElementsInMemory - 在内存中缓存的element的最大数目
l maxElementsOnDisk - 在磁盘上缓存的element的最大数目,若是0表示无穷大
l eternal - 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断
l overflowToDisk - 设定当内存缓存溢出的时候是否将过期的element缓存到磁盘上
以下属性是可选的:
l timeToIdleSeconds - 当缓存在EhCache中的数据前后两次访问的时间超过timeToIdleSeconds的属性取值时,这些数据便会删除,默认值是0,也就是可闲置时间无穷大
l timeToLiveSeconds - 缓存element的有效生命期,默认是0.,也就是element存活时间无穷大
diskSpoolBufferSizeMB 这个参数设置DiskStore(磁盘缓存)的缓存区大小.默认是30MB.每个Cache都应该有自己的一个缓冲区.
l diskPersistent - 在VM重启的时候是否启用磁盘保存EhCache中的数据,默认是false。
l diskExpiryThreadIntervalSeconds - 磁盘缓存的清理线程运行间隔,默认是120秒。每个120s,相应的线程会进行一次EhCache中数据的清理工作
l memoryStoreEvictionPolicy - 当内存缓存达到最大,有新的element加入的时候, 移除缓存中element的策略。默认是LRU(最近最少使用),可选的有LFU(最不常使用)和FIFO(先进先出)
-->
-
设置缓存使用,同时还可以通过JavaBean来修改一些配置。
<cache type="org.mybatis.caches.ehcache.EhcacheCache"> <!-- 可以通过JavaBean修改缓存的一些配置 --> </cache>
-
项目中使用
其实缓存表面上也就这么多东西,会用的话,没什么难的。