Ehcache的配置和使用

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 默认值).缓存的元素有一个时间戳,当缓存容量满了,
而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值