`
xaocaotanghui
  • 浏览: 55547 次
  • 性别: Icon_minigender_1
  • 来自: 广西
文章分类
社区版块
存档分类
最新评论

ehcache的简单配置

 
阅读更多
<?xml version="1.0" encoding="UTF-8"?>
        <ehcache>    
            <diskStore path="java.io.tmpdir" />
          <defaultCache maxElementsInMemory="100"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="30"
                timeToLiveSeconds="300"
          />
         <cache name="DEFAULT_CACHE" maxElementsInMemory="50000"
            eternal="false"
            overflowToDisk="true"
            timeToIdleSeconds="60"
                timeToLiveSeconds="300"
          /> 
        </ehcache>

 各配置参数的含义:
maxElementsInMemory:缓存中允许创建的最大对象数
eternal:缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期。
overflowToDisk:内存不足时,是否启用磁盘缓存。

timeToIdleSeconds:缓存数据的钝化时间,也就是在一个元素消亡之前,两次访问时间的最大时间间隔值,这只能在元素不是永久驻留时有效,如果该值是 0 就意味着元素可以停顿无穷长的时间。
timeToLiveSeconds:缓存数据的生存时间,也就是一个元素从构建到消亡的最大时间间隔值,这只能在元素不是永久驻 留时有效,如果该值是0就意味着元素可以停顿无穷长的时间。
memoryStoreEvictionPolicy:缓存满了之后的淘汰算法。LRU和FIFO算法这里就不做介绍。LFU算法直接淘汰使用比较少的对象,在内存保留的都是一些经常访问的对象。对于大部分网站项目,该算法比较适用。
如果应用需要配置多个不同命名并采用不同参数的Cache,可以相应修改配置文件,增加需要的Cache配置即可。

 

 

 

Spring整合ehcache

首先,在CLASSPATH下面放置ehcache.xml配置文件。在Spring的配置文件中先添加如下defaultCacheManager配置:

<bean id="defaultCacheManager"
		class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation">
			<value>classpath:ehcache.xml</value>
		</property>
	</bean>

配置ehcache.xml 中定义的cache

<bean id="ehCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
		<property name="cacheManager">
			<ref local="defaultCacheManager" />
		</property>
		<property name="cacheName">
			<value>DEFAULT_CACHE</value>
		</property>
	</bean>

接下来,写一个实现org.aopalliance.intercept.MethodInterceptor接口的拦截器类。有了拦截器就可以有选择性的配置想要缓存的 bean 方法。如果被调用的方法配置为可缓存,拦截器将为该方法生成 cache key 并检查该方法返回的结果是否已缓存。如果已缓存,就返回缓存的结果,否则再次执行被拦截的方法,并缓存结果供下次调用。具体代码如下:

import java.io.Serializable;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.Map;
import java.util.Set;

import net.sf.ehcache.Cache;
import net.sf.ehcache.Element;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

public class MethodCacheInterceptor implements MethodInterceptor, InitializingBean   
{   
    private static final Log logger = LogFactory.getLog(MethodCacheInterceptor.class);   
  
    private Cache cache;   
  
    public void setCache(Cache cache) {   
        this.cache = cache;   
    }   
  
    public MethodCacheInterceptor() {   
        super();   
    }   
  
    /**  
     * 拦截Service/DAO的方法,并查找该结果是否存在,如果存在就返回cache中的值,  
     * 否则,返回数据库查询结果,并将查询结果放入cache  
     */  
    public Object invoke(MethodInvocation invocation) throws Throwable {   
        String targetName = invocation.getThis().getClass().getName();   
        String methodName = invocation.getMethod().getName();   
        Object[] arguments = invocation.getArguments();   
        Object result=null;
        boolean hasCache = true;
        if(invocation.getThis() instanceof IDaoOperation){
            IDaoOperation dao = (IDaoOperation)invocation.getThis();
            hasCache = dao.getCache();
        }
        else{
            //hasCache 取对象的hasCache属性
            Object obj = invocation.getThis();
            try{
                Field field = obj.getClass().getDeclaredField("hasCache");
                field.setAccessible(true);
                Boolean boc = (Boolean)field.get(obj);
                hasCache = boc;
            }catch(Exception e){}
        }
        //告警配置不使用缓存
        hasCache = targetName.startsWith("com.xxxx.xxxx")?false:hasCache;
//        try{
//            hasCache = (Boolean) ReflectUtil.getter(invocation.getThis(), "hasCache");
//        }catch(Exception e){e.printStackTrace();}
//       boolean hasNotCache = methodName.endsWith("NotCache");
        logger.debug("Find object from cache is " + cache.getName());   
//        methodName = hasNotCache?methodName.substring(0,methodName.length()-"NotCache".length()):methodName;
        String cacheKey = getCacheKey(targetName, methodName, arguments);   
        Element element = null; 
        if(hasCache){
            element = cache.get(cacheKey);
        }
        else{
            cache.remove(cacheKey);
        }
        //开发时方式缓存读取
        if("false".equalsIgnoreCase(ConfigPropertiesUtil.getValue("SYSTEM_HASCACHE"))){
            element=null;
        }
        result = element!=null?element.getValue():result;
        if (element == null) {   
            logger.debug("Hold up method , Get method result and create cache........!");   
            result = invocation.proceed();
            if(result!=null){
                cache.remove(cacheKey);
                element = new Element(cacheKey, (Serializable) result);   
                cache.put(element);  
            }
        }   
        return result;   
    }   
    
    /**
     * 将对象转换成string,处理数组、List、MAP的处理
     * @param value
     * @return
     */
    private static String objectToString(Object value){
        if(value==null){return null;}
        StringBuffer sb = new StringBuffer();
        Object[] valueTemps = null;
        if(value instanceof Object[]){
            valueTemps = (Object[])value;
        }
        else if(value instanceof Collection){
            valueTemps = ((Collection)value).toArray();
        }
        if(valueTemps!=null){
            sb.append("[");
            for(Object obj : valueTemps){
                sb.append(objectToString(obj)+",");
            }
            sb.append("]");
            return sb.toString().hashCode()+"";
        }
        else if(value instanceof Map){
            sb.append("[");
            Set<Map.Entry> entitySet = ((Map)value).entrySet();
            for(Map.Entry entity:entitySet){
                Object key = entity.getKey();
                Object kv = entity.getValue();
                sb.append(objectToString(key)+"="+objectToString(kv)+",");
            }
            sb.append("]");
            return sb.toString().hashCode()+"";
        }
        else{
            return value.hashCode()+"";
        }
    }
    /**  
     * 获得cache key的方法,cache key是Cache中一个Element的唯一标识  
     * cache key包括 包名+类名+方法名,如com.co.cache.service.UserServiceImpl.getAllUser  
     */  
    private String getCacheKey(String targetName, String methodName, Object[] arguments) {   
        StringBuffer sb = new StringBuffer();   
        sb.append(targetName).append(".").append(methodName);   
        if ((arguments != null) && (arguments.length != 0)) {   
            sb.append("{");
            for (int i = 0; i < arguments.length; i++) {  
                sb.append(objectToString(arguments[i])+",");   
                sb.append(";");   
            }   
            sb.append("}");
        }   
        return sb.toString();   
    }   
       
    /**  
     * implement InitializingBean,检查cache是否为空  
     */  
    public void afterPropertiesSet() throws Exception {   
        Assert.notNull(cache, "Need a cache. Please use setCache(Cache) create it.");   
    }   
  
}  

 

 

分享到:
评论

相关推荐

    Ehcache 简单的监控

    在Ehcache的配置文件(通常是ehcache.xml)中,我们可以设置监控相关的参数,例如开启JMX注册、设置日志级别等。例如: ```xml &lt;cacheManagerEventListenerFactory class="net.sf.ehcache.distribution....

    ehcache配置使用详解

    2. **简单**:其简洁的API和丰富的文档使ehcache易于集成和使用,即使是对缓存技术不熟悉的开发者也能快速上手。 3. **多种缓存策略**:ehcache支持LRU(Least Recently Used)、LFU(Least Frequently Used)和FIFO...

    springmvc+ehcache简单例子

    在这个“springmvc+ehcache简单例子”中,我们将探讨如何将两者结合使用,以实现高效的数据缓存。 首先,让我们了解一下Spring MVC。Spring MVC提供了一个分层架构,允许开发者将业务逻辑、数据访问和用户界面分离...

    Ehcache Monitor 安装配置

    在你的缓存配置中,你也需要开启统计功能,例如在`&lt;cache&gt;`元素中设置`statistics="true"`,这样Ehcache会记录并报告关于缓存使用的详细信息。 启动Ehcache Monitor服务器非常简单,只需进入安装目录的`bin`子目录...

    SpringMVC+Mybatis+Spring+Shiro+ehcache整合配置文件

    Ehcache可以很好地与Spring集成,通过简单的配置即可实现缓存管理。 在整合这些技术时,首先需要在Spring的配置文件中定义bean,包括数据源、SqlSessionFactory(Mybatis的核心)、MapperScannerConfigurer(扫描...

    Ehcache(2): Ehcache实例在Eclipse中的配置 改进

    综上所述,Ehcache在Eclipse中的配置涉及到对Hibernate的设置、Ehcache配置文件的编写以及缓存策略的调整。理解这些知识点有助于我们在Java开发中更高效地利用缓存技术,提升系统的响应速度和整体性能。

    Ehcache分布式缓存与其在SpringBoot应用

    2. **Ehcache配置**:在`ehcache.xml`配置文件中,你可以指定Ehcache如何运行。对于分布式缓存,可以设置UDP多播或TCP单播模式。多播模式下,节点通过网络广播发现彼此;单播模式则需要指定其他节点的IP地址,实现点...

    Ehcache(一): Spring + Ehcache开场白

    配置Ehcache,我们可以在Spring的配置文件中定义一个`CacheManager` bean,指定Ehcache的配置文件路径。Ehcache的配置文件(如ehcache.xml)包含了缓存的命名空间、大小限制、过期策略等信息。例如: ```xml ...

    Ehcache_Hello

    在`Ehcache_Hello`这个案例中,开发者可能会创建一个简单的缓存区,并通过API添加、获取和移除缓存项。以下是一个基础的示例代码: ```java CacheManager cacheManager = CacheManager.create(); Cache cache = ...

    Spring AOP+ehCache简单缓存系统解决方案

    在`ehcache.xml`文件中,我们可以配置缓存的详细设置,包括缓存的大小、存活时间和过期策略。例如: ```xml &lt;ehcache&gt; &lt;/ehcache&gt; ``` 这个配置创建了一个名为“myCache”的缓存,最大可以在堆内存中存储100...

    ehcache资料(包含ehcache jar包)

    3. **缓存过期策略**:Ehcache允许设置时间、访问次数等条件来控制缓存项的生命周期,确保数据的时效性。 4. **缓存更新策略**:包括`PUT`操作时自动更新、监听数据库事件触发更新等方式,确保缓存与数据源保持同步...

    配置EhCache二级缓存

    ### 配置EhCache二级缓存 #### 一、简介 EhCache是一个高性能、易于使用的开源缓存...EhCache的配置相对简单,但其提供的功能却十分强大。开发者可以根据实际的应用场景灵活调整各种缓存策略,以满足不同的业务需求。

    ehcache项目缓存技术

    1. **内存管理**:Ehcache支持设置缓存大小,自动进行LRU(Least Recently Used)或LFU(Least Frequently Used)策略的内存管理,当内存达到上限时,会根据策略淘汰旧的或者访问频率较低的缓存项。 2. **持久化**...

    项目优化之Ehcache页面缓存

    本文将深入探讨Ehcache的工作原理、优势、配置以及如何将其应用于页面缓存,同时结合提供的代码案例和文档,帮助你更全面地理解和运用Ehcache。 1. Ehcache简介 Ehcache是由Terracotta公司开发的开源缓存解决方案,...

    springmvc Ehcache

    以下是一个简单的配置示例: ```xml &lt;ehcache&gt; maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" diskPersistent="false" ...

    ehcache开发工具包

    EhCache是一款高效、易用且功能强大的Java缓存库,它被广泛应用于各种Java应用程序中,以提高数据访问速度并降低数据库负载...无论是简单的小型项目还是复杂的大型系统,EhCache都能提供有效的缓存支持,提升整体性能。

    ehcachedemo

    在项目中,你需要配置`ehcache.xml`文件,其中包含缓存策略、大小限制、过期时间等设置。 2. **创建Cache对象**:使用Ehcache API,你可以创建和管理缓存实例。例如,`CacheManager`是核心管理器,它负责创建和管理...

    Ehcache缓存配置

    1. **声明式配置**:适用于简单的缓存需求,可以通过注解或配置文件等方式定义缓存策略。 2. **XML 配置**:最常用的配置方式之一,提供了丰富的配置选项和高度灵活性,适用于复杂的缓存管理需求。 3. **程序内配置*...

Global site tag (gtag.js) - Google Analytics