1、初识Ehcache

Ehcache是一种广泛使用的Java分布式缓存器,具有快速、精干等特点,是Hibernate中默认CacheProvider。它提供内存存储和磁盘存储两种方案,因此无需担心容量问题。Ehcache可以单独使用,一般在第三方库中被用到的比较多,如Hibernate、MyBatis等

因为Ehcache直接在JVM虚拟机中缓存,速度快,效率高,但是缓存共享十分麻烦,集群分布式应用不方便。Ehcache是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便。虽然Ehcache号称“分布式缓存器”,实际来看,口宣能力大于实际能力,当然,从商业角度来说,这也无可厚非。

2、Ehcache入门例子

2.1、在pom.xml中引入依赖

  • <dependency>
  • <groupId>net.sf.ehcache</groupId>
  • <artifactId>ehcache</artifactId>
  • <version>2.10.2</version>
  • </dependency>

2.2、在src/main/resources/创建一个配置文件 ehcache.xml

  • <?xml version="1.0" encoding="UTF-8"?>
  • <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  • xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
  • <!-- 磁盘缓存位置 -->
  • <diskStore path="java.io.tmpdir/ehcache"/>
  • <!-- 默认缓存 -->
  • <defaultCache
  • maxEntriesLocalHeap="10000"
  • eternal="false"
  • timeToIdleSeconds="120"
  • timeToLiveSeconds="120"
  • maxEntriesLocalDisk="10000000"
  • diskExpiryThreadIntervalSeconds="120"
  • memoryStoreEvictionPolicy="LRU">
  • <persistence strategy="localTempSwap"/>
  • </defaultCache>
  • <!—自定义缓存:MyCache -->
  • <cache name="MyCache"
  • maxElementsInMemory="1000"
  • eternal="false"
  • timeToIdleSeconds="5"
  • timeToLiveSeconds="5"
  • overflowToDisk="false"
  • memoryStoreEvictionPolicy="LRU"/>
  • </ehcache>

2.3、测试类

  • import net.sf.ehcache.Cache;
  • import net.sf.ehcache.CacheManager;
  • import net.sf.ehcache.Element;
  • public class CacheTest {
  • public static void main(String[] args) {
  • // 1. 创建缓存管理器
  • CacheManager cacheManager = CacheManager.create("./src/main/resources/ehcache.xml");
  • // 2. 获取缓存对象
  • Cache cache = cacheManager.getCache("HelloWorldCache");
  • // 3. 创建元素
  • Element element = new Element("key1", "value1");
  • // 4. 将元素添加到缓存
  • cache.put(element);
  • // 5. 获取缓存
  • Element value = cache.get("key1");
  • System.out.println("value: " + value);
  • System.out.println(value.getObjectValue());
  • // 6. 删除元素
  • cache.remove("key1");
  • // 7. 刷新缓存
  • cache.flush();
  • // 8. 关闭缓存管理器
  • cacheManager.shutdown();
  • }
  • }

3、MyBatis整合Ehcache

与Hibernate一样,MyBatis同样提供了一级缓存和二级缓存的支持。

一级缓存: 基于HashMap本地缓存,其存储作用域为Session,当Session flush或close之后,该Session中的所有Cache就将清空。

二级缓存:与一级缓存其机制相同,默认也是采用HashMap存储,不同在于其存储作用域为 Mapper,并且可自定义第三方存储源,如Ehcache框架等。

MyBatis中一级缓存是默认开启的,只要当SqlSession不关闭,那么你的操作会默认存储使用一级缓存。

对于缓存数据更新机制,当某一个作用域(一级缓存Session/二级缓存Mapper)的进行了 Create/Updat/Delet 操作后,默认该作用域下所有select中的缓存将被clear。

3.1、引入Ehcache相关的包

MyBatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。对于MyBatis和Ehcache整合,可以直接使用开源的mybatis-ehcache,此整合包中提供了一个cache接口的实现类。在项目中加入如下两个jar包:

  • <dependency>
  • <groupId>net.sf.ehcache</groupId>
  • <artifactId>ehcache</artifactId>
  • <version>2.10.1</version>
  • </dependency>
  • <dependency>
  • <groupId>org.mybatis</groupId>
  • <artifactId>mybatis-ehcache</artifactId>
  • <version>1.0.0</version>
  • </dependency>

3.2、配置mapper中cachetype

配置mapper中cache中的type为ehcache对cache接口的实现类型。

  • <mapper namespace='UserMapper'>
  • <cachetype='org.mybatis.caches.ehcache.EhcacheCache'>
  • </cache>

3.3、根据需求调整缓存参数:

  • <cachetype='org.mybatis.caches.ehcache.EhcacheCache'>
  • <propertyname='timeToIdleSeconds'value='3600'/>
  • <propertyname='timeToLiveSeconds'value='3600'/>
  • <!-- 同ehcache参数maxElementsInMemory-->
  • <propertyname='maxEntriesLocalHeap'value='1000'/>
  • <!-- 同ehcache参数maxElementsOnDisk -->
  • <propertyname='maxEntriesLocalDisk'value='10000000'/>
  • <propertyname='memoryStoreEvictionPolicy'value='LRU'/>
  • </cache>

3.4、加入Ehcache的配置文件

在classpath下配置ehcache.xml

  • <ehcachexmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
  • xsi:noNamespaceSchemaLocation='../config/ehcache.xsd'>
  • <diskStorepath='/cn/mybatis/cache'/>
  • <defaultCache
  • maxElementsInMemory='1000'
  • maxElementsOnDisk='10000000'
  • eternal='false'
  • overflowToDisk='false'
  • timeToIdleSeconds='120'
  • timeToLiveSeconds='120'
  • diskExpiryThreadIntervalSeconds='120'
  • memoryStoreEvictionPolicy='LRU'>
  • </defaultCache>
  • </ehcache>

标签: none

添加新评论