1、定义缓存工具类 EhcacheUtil.java:
package com.test.util;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/**
* ehcache 缓存工具类
*
* cacheName在ehcache.xml中配置
*/
public class EhcacheUtil {
public static CacheManager manager = CacheManager.create();
public static Object get(String cacheName, Object key) {
Cache cache = manager.getCache(cacheName);
if (cache != null) {
Element element = cache.get(key);
if (element != null) {
return element.getObjectValue();
}
}
return null;
}
public static void put(String cacheName, Object key, Object value) {
Cache cache = manager.getCache(cacheName);
if (cache != null) {
cache.put(new Element(key, value));
}
}
public static boolean remove(String cacheName, Object key) {
Cache cache = manager.getCache(cacheName);
if (cache != null) {
return cache.remove(key);
}
return false;
}
public static void main(String[] args) {
String key = "key";
String value = "hello";
EhcacheUtil.put("codeCache", key, value);
System.out.println(EhcacheUtil.get("codeCache", key));
}
}
2、数据库操作层类代码引入ehcache 后的优化:
public class ReportCodeDao {
private BasicDB db = new BasicDB();
/**
* 根据codeId获取对应的名称
*
* @param cid
* @return
* @throws CacheException
* @throws IllegalStateException
*/
public String getCodeDesc(String cid) throws Exception {
String codedesc = "";
// 获取CacheManager
CacheManager cacheManager = EhcacheUtil.getCacheManager();
// 用配置文件中配置的colorcache创建cache缓存
Cache cache = cacheManager.getCache("codeCache");
// 查看cache中是否存在cid的缓存
Element element = cache.get(cid);
// 如果不存在,从数据库中查询
if (element == null) {
String sql = "select codedesc from TBL_REPORT_CODEDESC where cid='"
+ cid + "'";
// System.out.println("从数据库中查询!" + sql);
ResultSet rs = db.executeQuery(sql);
try {
if (rs.next())
codedesc = rs.getString("codedesc");
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.closed();
}
cache.put(new Element(cid, codedesc));
} else {// 如果存在,从缓存中加载
// System.out.println("从缓存中加载!");
codedesc = element.getValue().toString();
}
// System.out.println("codedesc:" + codedesc);
return codedesc;
}
3、缓存配置文件ehcache.xml
<ehcache>
<diskStore path="java.io.codeFile" />
<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
<cache name="codeCache" maxElementsInMemory="10000" eternal="true"
timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" />
</ehcache>
下列属性是 defaultCache 必须的,具体 说明:
maxElementsInMemory: 设定内存中创建对象的最大值;
eternal:设置内存中对象是否永久驻留。如果为true,对象永不消亡;
timeToIdleSeconds:设置元素消亡前的停顿时间,也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。
这只能在元素不是永久驻留时有效。如果该值是 0 ,就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds:设置元素消亡前的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效。
overflowToDisk:设置当内存中缓存达到 maxElementsInMemory 限制时元素是否可写到磁盘上。
属性说明:
diskStore :指定数据存储位置,可指定磁盘中的文件夹位置
defaultCache : 默认的管理策略 以下属性是必须的:
name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
maxElementsInMemory: 在内存中缓存的element的最大数目。
maxElementsOnDisk: 在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
eternal: 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,
如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。
overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。
以下属性是可选的:
timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
diskPersistent: 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
memoryStoreEvictionPolicy: 如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。
缓存的3 种清空策略 :
FIFO ,first in first out (先进先出).
LFU , Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
LRU ,Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,
而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
package com.test.util;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
/**
* ehcache 缓存工具类
*
* cacheName在ehcache.xml中配置
*/
public class EhcacheUtil {
public static CacheManager manager = CacheManager.create();
public static Object get(String cacheName, Object key) {
Cache cache = manager.getCache(cacheName);
if (cache != null) {
Element element = cache.get(key);
if (element != null) {
return element.getObjectValue();
}
}
return null;
}
public static void put(String cacheName, Object key, Object value) {
Cache cache = manager.getCache(cacheName);
if (cache != null) {
cache.put(new Element(key, value));
}
}
public static boolean remove(String cacheName, Object key) {
Cache cache = manager.getCache(cacheName);
if (cache != null) {
return cache.remove(key);
}
return false;
}
public static void main(String[] args) {
String key = "key";
String value = "hello";
EhcacheUtil.put("codeCache", key, value);
System.out.println(EhcacheUtil.get("codeCache", key));
}
}
2、数据库操作层类代码引入ehcache 后的优化:
public class ReportCodeDao {
private BasicDB db = new BasicDB();
/**
* 根据codeId获取对应的名称
*
* @param cid
* @return
* @throws CacheException
* @throws IllegalStateException
*/
public String getCodeDesc(String cid) throws Exception {
String codedesc = "";
// 获取CacheManager
CacheManager cacheManager = EhcacheUtil.getCacheManager();
// 用配置文件中配置的colorcache创建cache缓存
Cache cache = cacheManager.getCache("codeCache");
// 查看cache中是否存在cid的缓存
Element element = cache.get(cid);
// 如果不存在,从数据库中查询
if (element == null) {
String sql = "select codedesc from TBL_REPORT_CODEDESC where cid='"
+ cid + "'";
// System.out.println("从数据库中查询!" + sql);
ResultSet rs = db.executeQuery(sql);
try {
if (rs.next())
codedesc = rs.getString("codedesc");
} catch (SQLException e) {
e.printStackTrace();
} finally {
db.closed();
}
cache.put(new Element(cid, codedesc));
} else {// 如果存在,从缓存中加载
// System.out.println("从缓存中加载!");
codedesc = element.getValue().toString();
}
// System.out.println("codedesc:" + codedesc);
return codedesc;
}
3、缓存配置文件ehcache.xml
<ehcache>
<diskStore path="java.io.codeFile" />
<defaultCache maxElementsInMemory="10000" eternal="false"
timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
<cache name="codeCache" maxElementsInMemory="10000" eternal="true"
timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true" />
</ehcache>
下列属性是 defaultCache 必须的,具体 说明:
maxElementsInMemory: 设定内存中创建对象的最大值;
eternal:设置内存中对象是否永久驻留。如果为true,对象永不消亡;
timeToIdleSeconds:设置元素消亡前的停顿时间,也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。
这只能在元素不是永久驻留时有效。如果该值是 0 ,就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds:设置元素消亡前的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻留时有效。
overflowToDisk:设置当内存中缓存达到 maxElementsInMemory 限制时元素是否可写到磁盘上。
属性说明:
diskStore :指定数据存储位置,可指定磁盘中的文件夹位置
defaultCache : 默认的管理策略 以下属性是必须的:
name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
maxElementsInMemory: 在内存中缓存的element的最大数目。
maxElementsOnDisk: 在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
eternal: 设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,
如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。
overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。
以下属性是可选的:
timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
diskPersistent: 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
memoryStoreEvictionPolicy: 如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。
缓存的3 种清空策略 :
FIFO ,first in first out (先进先出).
LFU , Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
LRU ,Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,
而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。