EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点,是Hibernate中默认的CacheProvider。
官网:http://ehcache.org/
我下载的版本是2.6.6,通过maven下载的,官网有各个版本详细的文档,开发教程。
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache-core</artifactId> <version>2.6.6</version> </dependency>
在eclipse中构建maven工程EhcacheTest项目,加入如上依赖,
按照官网文档开始测试
CacheManager singletonManager = CacheManager.create(); singletonManager.addCache("testCache"); Cache cache = singletonManager.getCache("testCache"); Element element = new Element("key1", "value1"); cache.put(element); Element e = cache.get("key1"); System.out.println(e.getObjectValue());
运行这段代码发现报错:
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. value1
上网找原因发现是slf4j和log4j冲突,解决办法,可以添加一个解决冲突的依赖:
<dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.6.1</version> </dependency>
就不会报错了。
Ehcache使用CacheManager来管理Cache,Cache就是我们用来缓存数据的类。
下面先来说说CacheManager的几种创建方法:
根据官网文档显示,2.5之前的版本是允许相同名称的多个CacheManager存在同一个JVM中,所以,每次new CacheManager(...)会创建一个新的CacheManager,而不会关心是否已经有存在的CacheManager,这将会加大系统内存消耗,因为根本没必要,我们用来缓存数据的是Cache,而管理Cache的CacheManager不需要每次创建,new一个新的出来。
所以Ehcache在2.5之后中的版本中不再允许同名的多个CacheManager存在同一个JVM中,使用CacheManager.create()来返回一个已经存在的单例的
CacheManager,如果没有,则创建一个单例的CacheManager。
创建单例的CacheManager,官方提供了四种方法:
1.
CacheManager.newInstance(Configuration configuration);
根据配置创建一个新的CacheManager单例实例,或返回一个已经存的配置的实例。
2.
CacheManager.create();
根据系统默认的配置,创建一个新的CacheManager单例实例,或返回一个已经存在的单例。此方法类似于
CacheManager.getInstance();
3.
CacheManager.create(Configuration configuration);
根据已经配好的配置创建一个新的CacheManager单例实例,或返回一个已经存的配置的实例。
4.
new CacheManager(Configuration configuration)
创建一个新的CacheManager,如果同名的实例已经存在或配置参数为空,会抛出一个异常。
下面来使用CacheManager,Cache来测试缓存数据:
1.使用默认的CacheManager测试,即系统自带的配置ehcache.xml在官方jar包中,有个默认配置。
CacheManager singletonManager = CacheManager.create(); singletonManager.addCache("testCache"); Cache cache = singletonManager.getCache("testCache"); Element element = new Element("key1", "value1"); cache.put(element); Element e = cache.get("key1"); System.out.println(e.getObjectValue());
结果:value1
2.使用自定义的配置CacheManager测试,ehcache.xml配置文件如下:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="d:\ehcache"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </defaultCache> <cache name="sampleCache1" maxElementsInMemory="1" maxElementsOnDisk="10000" eternal="false" overflowToDisk="true" diskSpoolBufferSizeMB="20" diskPersistent="true" timeToIdleSeconds="43200" timeToLiveSeconds="86400" memoryStoreEvictionPolicy="LFU" /> </ehcache>
java代码:
CacheManager manager = CacheManager.create("src/main/java/ehcache.xml"); Cache cache = manager.getCache("sampleCache1"); Element element = new Element("key1", "value1"); cache.put(element); Element e = cache.get("key1"); System.out.println(e.getObjectValue());
结果:value1
3.Ehcache是一个进程式的缓存,用完可以关闭它:
manager.shutdown();
Ehcache还有很多其它方法,官网文档很详细,以后深入使用,比如与Srping集成等。