集成EhCache缓存

EhCache 是一个纯粹的 Java 进程内的缓存框架,具有快速、精干等特点。具体来说,EhCache 主要的特性如下。

  • 快速。

  • 简单。

  • 多种缓存策略。

  • 缓存数据有内存和磁盘两级,无须担心容量问题。

  • 缓存数据会在虚拟机重启的过程中写入磁盘。

  • 可以通过 RMI、可插入 API 等方式进行分布式缓存。

  • 具有缓存和缓存管理器的侦听接口。

  • 支持多缓存管理器实例以及一个实例的多个缓存区域。

因为以上诸多优点,MyBatis 项目开发者最早提供了 EhCache 的 MyBatis 二级缓存实现,该项目名为 ehcache-cache,地址是 https://github.com/mybatis/ehcache-cache

这一节我们就来介绍使用 MyBatis 官方提供的 ehcache-cache 集成 EhCache 缓存框架的实例。下面,按照如下步骤集成 EhCache 缓存框架。

  1. 添加项目依赖

    在 pom.xml 中添加如下依赖。

    <!--使用ehcache框架-->
    <dependency>
        <groupId>org.mybatis.caches</groupId>
        <artifactId>mybatis-ehcache</artifactId>
        <version>1.0.3</version>
    </dependency>
  2. 配置 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 即可。

  3. 修改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"/>