Mybatis外置二级缓存

ehCache二级缓存

mybatis除了自带的二级缓存,还支持一些第三方的缓存,并且由于mybatis只擅长sql,所以这些第三方缓存的性能要比mybatis的好一些,下面以ehCache为例看下第三方的二级缓存使用方式。
ehCache是一款知名的缓存框架,hibernate框架的默认缓存策略使用的就是ehCache。
使用ehCache二级缓存,实体类无需实现Serializable接口。

添加ehCache依赖jar包
需要添加ehCache和mybatis-ehCache整合两个jar包,除此之外ehcache使用了slf4j记录日志,所以需要导入slf4j相关的jar包,需要注意的是目前mybatis只支持ehcache的2.x的版本

    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.10.0</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.caches</groupId>
        <artifactId>mybatis-ehcache</artifactId>
        <version>1.1.0</version>
    </dependency>

    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-api</artifactId>
        <version>1.7.25</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.25</version>
    </dependency>

添加ehcache.xml配置文件
在resources目录下创建ehcache.xml文件,里面填写下面内容,配置项是ehcache2.x的,在ehcache3.x中会不同,所以下面内容简单了解即可:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">

    <diskStore path="java.io.tmpdir"/>

    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            maxElementsOnDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
</ehcache>

diskStore标签:指定一个文件目录,当内存空间不够,需要将二级缓存中数据写到硬盘上时,会写到这
个指定目录中。其值一般为 java.io.tmpdir,表示当前系统的默认文件临时目录

  • maxElementsInMemory:指定该内存缓存区可以存放缓存对象的最多个数。
  • eternal:设定缓存对象是否不会过期。若设为 true,表示对象永远不会过期,此时会忽略 timeToIdleSeconds 与 timeToLiveSeconds 属性。默认值为 false。
  • timeToIdleSeconds:设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,若处于空闲状态的时间超过了 timeToIdleSeconds 设定的值,这个对象就会过期。当对象过期,EHCache 就会将它从缓存中清除。 设置值为 0,则对象可以无限期地处于空闲状态。
  • timeToLiveSeconds:设定对象允许存在于缓存中的最长时间,以秒为单位。当对象自从被存放到缓存后,若处于缓存中的时间超过了 timeToLiveSeconds 设定的值,这个对象就会过期。当对象过期,EHCache 就会将它从缓存中清除。设置值为 0,则对象可以无限期地存在于缓存中。注意,只有 timeToLiveSeconds≥ timeToIdleSeconds,才有意义。
  • overflowToDisk: 设定为 true,表示当缓存对象达到了 maxElementsInMemory 界限,会将溢出的对象写到元素指定的硬盘目录缓存中。
  • maxElementsOnDisk:指定硬盘缓存区可以存放缓存对象的最多个数。
  • diskPersistent:指定当程序结束时,硬盘缓存区中的缓存对象是否做持久化。
  • diskExpiryThreadIntervalSeconds:指定硬盘中缓存对象的失效时间间隔。
  • memoryStoreEvictionPolicy:如果内存缓存区超过限制,选择移向硬盘缓存区中的对象时使用的策略。支持三种策略:
    • FIFO:First In First Out,先进先出
    • LFU:Less Frequently Used,最少使用
    • LRU:Least Recently Used,最近最少使用

启用 ehcache 缓存
在映射文件的 mapper 中cache中通过 type 指定缓存机制为 Ehcache 缓存

<cache type="org.mybatis.caches.ehcache.EhcacheCache"/>

除此之外还可以在不同的mapper中进行个性化的设置:

  <cache type="org.mybatis.caches.ehcache.EhcacheCache"/>
    <property name="timeToIdleSeconds" value="3600"/>
    <property name="timeToLiveSeconds" value="3600"/>
    <property name="maxEntriesLocalHeap" value="1000"/>
    <property name="maxEntriesLocalDisk" value="10000000"/>
    <property name="memoryStoreEvictionPolicy" value="LRU"/>
  </cache>

这些设置是优于ehcache.xml文件中的配置的。