集成ehcache
Ehcache是一种广泛使用的开源Java分布式缓存。主要面向通用缓存,Java EE和轻量级容器。它具有内存和磁盘存储,缓存加载器,缓存扩展,缓存异常处理程序,一个gzip缓存servlet过滤器,支持REST和SOAP api等特点。
主要的特性有:
快速
简单
多种缓存策略
缓存数据有两级:内存和磁盘,因此无需担心容量问题
缓存数据会在虚拟机重启的过程中写入磁盘
可以通过RMI、可插入API等方式进行分布式缓存
具有缓存和缓存管理器的侦听接口
支持多缓存管理器实例,以及一个实例的多个缓存区域
如何集成?
- 添加maven依赖:
<!-- https://mvnrepository.com/artifact/org.mybatis.caches/mybatis-ehcache -->
<dependency>
<groupId>org.mybatis.caches</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.sf.ehcache/ehcache -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>2.10.4</version>
</dependency>
再src/main/resources下面配置配置ehcache.xml文件:
<?xml version="1.0" encoding="UTF-8" ?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false"> <!-- xsd约束请参考: http://ehcache.org/ehcache.xsd 更多配置参考: http://www.ehcache.org/ehcache.xml copyOnRead的含义是:判断从缓存中读取数据时时返回对象的引用还是复制一个对象返回。 默认情况下是false,即返回数据的引用,这种情况下发怒hi的都是相同的对象,和MyBatis 默认缓存中的只读对象是相同的。如果设置为true,那就是可读写缓存,每次读取缓存时都会 复制一个新的实例。 copyOnWrite的含义是:判断写入缓存时时直接缓存对象的引用还是复制一个对象后缓存, 默认也是false。如果想使用可读写缓存,就需要将这两个属性配置为true,如果使用只读 缓存,可以不配置这两个属性,使用默认值false即可。 --> <diskStore path="D:/cache"/> <defaultCache maxElementsInMemory="3000" eternal="false" copyOnRead="true" timeToIdleSeconds="3600" timeToLiveSeconds="3600" overflowToDisk="true"/> </ehcache>
修改RoleMapper.xml中的缓存配置
<!-- ehcache提供了两个缓存的实现类 org.mybatis.caches.ehcache.EhcacheCache org.mybatis.caches.ehcache.LoggingEhcache 这两个缓存,第二个时带日志的缓存,由于MyBatis初始化缓存时,如果Cache不是继承 自LoggingEhcache,MyBatis便会使用LoggingEhcache装饰代理缓存,所以上面两个 缓存使用时并没有区别,都会输出缓存命中率的日志。 这里通过设置type属性就可以使用ehcache了。 --> <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
二级缓存使用场景
二级缓存虽然好处很多,但并不是什么时候都可以使用 。 在以下场景中,推荐使用二级缓存。
以查询为主的应用中,只有尽可能少的增、删、改操作 。
绝大多数以单表操作存在时,由于很少存在互相关联的情况,因此不会出现脏数据 。
可以按业务划分对表进行分组时 , 如关联的表比较少,可以通过参照缓存进行配置。
除了推荐使用的情况,如果脏读对系统没有影响,也可以考虑使用 。 在无法保证数据不出
现脏读的情况下 , 建议在业务层使用可控制的缓存代替 二级缓存 。