集成EhCache缓存
EhCache 是一个纯粹的 Java 进程内的缓存框架,具有快速、精干等特点。具体来说,EhCache 主要的特性如下。
-
快速。
-
简单。
-
多种缓存策略。
-
缓存数据有内存和磁盘两级,无须担心容量问题。
-
缓存数据会在虚拟机重启的过程中写入磁盘。
-
可以通过 RMI、可插入 API 等方式进行分布式缓存。
-
具有缓存和缓存管理器的侦听接口。
-
支持多缓存管理器实例以及一个实例的多个缓存区域。
因为以上诸多优点,MyBatis 项目开发者最早提供了 EhCache 的 MyBatis 二级缓存实现,该项目名为 ehcache-cache,地址是 https://github.com/mybatis/ehcache-cache 。
这一节我们就来介绍使用 MyBatis 官方提供的 ehcache-cache 集成 EhCache 缓存框架的实例。下面,按照如下步骤集成 EhCache 缓存框架。
-
添加项目依赖
在 pom.xml 中添加如下依赖。
<!--使用ehcache框架--> <dependency> <groupId>org.mybatis.caches</groupId> <artifactId>mybatis-ehcache</artifactId> <version>1.0.3</version> </dependency>
-
配置 EhCache
在 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" monitoring="autodetect" dynamicConfig="true"> <diskStore path="D:/cache" /> <defaultCache maxElementsInMemory="3000" eternal="false" copyOnRead="true" copyOnWrite="true" timeToIdleSeconds="3600" timeToLiveSeconds="3600" overflowToDisk="true" diskPersistent="true"/> </ehcache>
有关 EhCache 的详细配置可以参考地址 http://www.ehcache.org/ehcache.xml 中的内容。
上面的配置中重点要看两个属性,copyOnRead 和 copyOnWrite 属性。这两个属性的配置会对后面使用二级缓存产生很大影响。
copyOnRead 的含义是,判断从缓存中读取数据时是返回对象的引用还是复制一个对象返回。默认情况下是 false,即返回数据的引用,这种情况下返回的都是相同的对象,和 MyBatis 默认缓存中的只读对象是相同的。如果设置为 true,那就是可读写缓存,每次读取缓存时都会复制一个新的实例。
copyOnWrite 的含义是,判断写入缓存时是直接缓存对象的引用还是复制一个对象然后缓存,默认也是 false。如果想使用可读写缓存,就需要将这两个属性配置为 true,如果使用只读缓存,可以不配置这两个属性,使用默认值 false 即可。
-
修改RoleMapper.xml中的缓存配置
ehcache-cache 提供了如下 2 个可选的缓存实现。
-
org.mybatis.caches.ehcache.EhcacheCache
-
org.mybatis.caches.ehcache.LoggingEhcache
在这两个缓存中,第二个是带日志的缓存,由于 MyBatis 初始化缓存时,如果 Cache 不是继承自 LoggingEhcache(org.mybatis.caches.ehcache.LoggingEhcache),MyBatis 便会使用 Logging Ehcache 装饰代理缓存,所以上面两个缓存使用时并没有区别,都会输出缓存命中率的日志。
修改 RoleMapper.xml 中的配置如下。
<mapper namespace="cn.liaozh.mybatis2.ch7.cache.mapper.RoleMapper">
<!--使用ehcahe缓存-->
<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
<!--其它配置-->
</mapper>
只通过设置 type 属性就可以使用 EhCache 缓存了,这时 cache 的其他属性都不会起到任何作用,针对缓存的配置都在 ehcache.xml 中进行。在 ehcache.xml 配置文件中,只有一个默认的缓存配置,所以配置使用 EhCache 缓存的 Mapper 映射文件都会有一个以映射文件命名空间命名的缓存。如果想针对某一个命名空间进行配置,需要在 ehcache.xml 中添加一个和映射文件命名空间一致的缓存配置,例如针对 RoleMapper,可以进行如下配置。
<cache
name="tk.mybatis.simple.mapper.RoleMapper"
maxElementsInMemory="3000"
eternal="false"
copyOnRead="true"
copyOnWrite="true"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600"
overflowToDisk="true"
diskPersistent="true"/>