`
chenlb
  • 浏览: 695817 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Spring ehcache 之"城市"缓存

阅读更多
      先描述下我的环境eclipse 3.2.2+myeclilpse 5.5.1
Spring 2.0.6,Ehcache用spring2.0.6带的1.2.4
加入的jar
Spring.jar
commons-logging.jar
ehcache-1.2.4.jar
log4j-1.2.14.jar
junit3.8.1.jar

      示例描述:通过省ID找它下面的市,缓存市.

1.我用IdAndName类封装市,可以替换成String.
package com.chenlb.study.ehcache;

/**
 * 2007-8-2
 * 
@author chenlb
 * 
 
*/
public class IdAndName {

    
private Integer id;
    
private String name;
    
    
public IdAndName() {}
    
    
    
/**
     * 
@param id
     * 
@param name
     
*/
    
public IdAndName(Integer id, String name) {
        
super();
        
this.id = id;
        
this.name = name;
    }
    
    
public Integer getId() {
        
return id;
    }
    
public void setId(Integer id) {
        
this.id = id;
    }
    
public String getName() {
        
return name;
    }
    
public void setName(String name) {
        
this.name = name;
    }    
}

2.定义一个接口CityCache
package com.chenlb.study.ehcache;

import java.util.List;

/**
 * 2007-8-2
 * 
@author chenlb
 * 
 
*/
public interface CityCache {
    
public List<IdAndName> getCitys(Integer provinceId);
}

3.定义数据类CityData,
/*
 * 
 
*/
package com.chenlb.study.ehcache;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 2007-8-2
 * 
@author chenlb
 * 
 
*/
public class CityData {

    
static Map<Integer, List<IdAndName>> provinces = new HashMap<Integer, List<IdAndName>>();
    
    
static {
        ArrayList
<IdAndName> al = new ArrayList<IdAndName>();    //广东
        al.add(new IdAndName(1,"广州市"));    al.add(new IdAndName(2,"梅州市"));
        provinces.put(
1, al);
        
        al 
= new ArrayList<IdAndName>();    //上海
        al.add(new IdAndName(1,"黄浦"));    al.add(new IdAndName(2,"卢湾"));
        provinces.put(
2, al);
    }
    
    
/**
     * 此方法可以换成从数据库得到数据
     * 
@param provinceId
     * 
@return
     
*/
    
public static List<IdAndName> getCityByProvince(Integer provinceId) {
        
return provinces.get(provinceId);
    }
}

4.市缓存实现CityCacheMemoryImpl
/*
 * 
 
*/
package com.chenlb.study.ehcache;

import java.util.List;

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

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 2007-8-2
 * 
@author chenlb
 * 
 
*/
public class CityCacheMemoryImpl implements CityCache{
    
private static final Log logger = LogFactory.getLog(CityCacheMemoryImpl.class);
    
private Cache cityCache;
    
    
/* (non-Javadoc)
     * @see com.chenlb.study.ehcache.CityCache#getCitys(java.lang.Integer)
     
*/
    
public List<IdAndName> getCitys(Integer provinceId) {
        
// TODO Auto-generated method stub
        Element element = cityCache.get(provinceId);
        
if(element == null) {
            List
<IdAndName> lt = CityData.getCityByProvince(provinceId);//可以认为是数据查询
            element 
= new Element(provinceId, lt);
            cityCache.put(element);
            
if(logger.isInfoEnabled()) {
                logger.info(
"城市加载到缓存");
            }
        }
        
return (List<IdAndName>) element.getValue();
    }


    
public void setCityCache(Cache cityCache) {
        
this.cityCache = cityCache;
    }

}
说明:getcitys()方法重要,要加载没有的内容


5.ehcache.xml同时把ehcache.xsd放到同一目录
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
    
<diskStore path="java.io.tmpdir"/>
    
<defaultCache
            
maxElementsInMemory="10000"
            eternal
="false"
            timeToIdleSeconds
="120"
            timeToLiveSeconds
="120"
            overflowToDisk
="true"
            maxElementsOnDisk
="10000000"
            diskPersistent
="false"
            diskExpiryThreadIntervalSeconds
="120"
            memoryStoreEvictionPolicy
="LRU"
            
/>
    
<cache name="cityCache"
           maxElementsInMemory
="10"   //最大缓存10个对象
           eternal
="false"   //不是永久有效
           overflowToDisk
="false" //缓存满了不写的磁盘
           timeToIdleSeconds
="1"   //1秒后没有读就失效
           timeToLiveSeconds
="2" //2秒后失效
           memoryStoreEvictionPolicy
="LFU"
            
/>
</ehcache>

6.Spring 配置文件夹applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd">

    
<bean id="cacheManager"
        class
="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        
<property name="configLocation"
            value
="classpath:com/chenlb/study/ehcache/ehcache.xml">
        
</property>
    
</bean>
    
    
<bean id="cityCacheBean" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
        
<property name="cacheManager" ref="cacheManager"></property>
        
<property name="cacheName" value="cityCache"></property>
    
</bean>

    
<bean id="cityCache" class="com.chenlb.study.ehcache.CityCacheMemoryImpl">
        
<property name="cityCache" ref="cityCacheBean"></property>
    
</bean>
</beans>

7.测试用例CityCacheTest
/*
 * 
 
*/
package com.chenlb.study.ehcache;

import java.util.List;
import java.util.Random;

import junit.framework.TestCase;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * 2007-8-2
 * 
@author chenlb
 * 
 
*/
public class CityCacheTest extends TestCase {

    
protected final Log logger = LogFactory.getLog(getClass());

    
private ApplicationContext context;
    
private Random random;
    
/**
     * 
@throws java.lang.Exception
     
*/
    
protected void setUp() throws Exception {
        context 
= new ClassPathXmlApplicationContext(
                
new String[] {"application*.xml"}
            );
        random 
= new Random();
    }

    
/**
     * 
@throws java.lang.Exception
     
*/
    
protected void tearDown() throws Exception {
    }

    
/**
     * Test method for {
@link com.chenlb.study.ehcache.CityCache#getCitys(java.lang.Integer)}.
     
*/
    
public void testGetCitys() {
        CityCache cityCache 
= (CityCache) context.getBean("cityCache");
        
        List
<IdAndName> citys = cityCache.getCitys(1);
        
        assertNotNull(citys);
        assertTrue(citys.size() 
> 0);
        
for(IdAndName inn : citys) {
            logger.info(
"省1 : "+inn.getName());
        }
        
        citys 
= cityCache.getCitys(2);
        assertNotNull(citys);
        assertTrue(citys.size() 
> 0);
        
for(IdAndName inn : citys) {
            logger.info(
"省2 : "+inn.getName());
        }
    }

    
public void testGetCitysWithLoop() {
        CityCache cityCache 
= (CityCache) context.getBean("cityCache");
        
        List
<IdAndName> citys, citys_2;
        
int loopNum = 5;
        
int totelTimes = 0;
        
do {
            logger.info(
"===============第 "+(6-loopNum)+"次循环===============");
            citys 
= cityCache.getCitys(1);
            assertNotNull(citys);
            assertTrue(citys.size() 
> 0);
            
for(IdAndName inn : citys) {
                logger.info(
"省1 : "+inn.getName());
            }
            citys_2 
= cityCache.getCitys(2);
            assertNotNull(citys_2);
            assertTrue(citys_2.size() 
> 0);
            
for(IdAndName inn : citys_2) {
                logger.info(
"省2 : "+inn.getName());
            }
            loopNum    
--;
            
try {
                
int times = random.nextInt(800+ 400;//400 - 1200 ms
                Thread.sleep(times);
                totelTimes 
+= times;
                logger.info(totelTimes 
+ " ms 后, 间隔: "+times+" ms");
            } 
catch (InterruptedException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
while(loopNum > 0);
        
        loopNum 
= 5;
        
do {    //省2
            logger.info("===============第 "+(6-loopNum)+"次循环===============");
            citys 
= cityCache.getCitys(2);
            assertNotNull(citys);
            assertTrue(citys.size() 
> 0);
            
for(IdAndName inn : citys) {
                logger.info(
"省2 : "+inn.getName());
            }
            loopNum    
--;
            
try {
                
int times = random.nextInt(400+ 400;//400 - 800 ms
                Thread.sleep(times);
                totelTimes 
+= times;
                logger.info(totelTimes
+" ms 后, 间隔: "+times+" ms");
            } 
catch (InterruptedException e) {
                
// TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
while(loopNum > 0);
        
    }
}


有什么不足的地方请高人指点
分享到:
评论

相关推荐

    spring + ehcache + redis两级缓存

    当我们谈论“Spring + Ehcache + Redis”两级缓存时,我们实际上是在讨论如何在Java环境中利用Spring框架来集成Ehcache作为本地缓存,并利用Redis作为分布式二级缓存,构建一个高效且可扩展的缓存解决方案。...

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

    在本篇【Spring AOP+ehCache简单缓存系统解决方案】中,我们将探讨如何利用Spring AOP(面向切面编程)和ehCache框架来构建一个高效、简单的缓存系统,以提升应用程序的性能。ehCache是一款流行的开源Java缓存库,它...

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

    Ehcache是一个高性能的、基于Java的进程内缓存解决方案,它被广泛应用于各种Java应用程序,包括Java EE和轻量级容器。Ehcache的主要优势在于它的快速响应、易用性和丰富的缓存策略。它提供了两种级别的缓存存储:...

    Ehcache 整合Spring 使用页面、对象缓存

    ### Ehcache 整合Spring 使用页面、对象缓存 #### 一、Ehcache简介与特点 Ehcache是一款开源的、高性能的Java缓存框架,它可以用来存储、检索短期数据,以减轻数据库的压力,提高应用程序性能。Ehcache不仅支持...

    Spring 与Ehcache实现基于方法的缓存

    在IT行业中,Spring框架是Java领域最广泛应用的轻量级框架之一,它为开发者提供了强大的依赖注入(DI)和面向切面编程(AOP)功能。Ehcache则是一款广泛使用的开源缓存解决方案,用于提高应用程序性能,减少数据库...

    Spring4 整合EhCache实现 页面缓存 零配置

    在本文中,我们将深入探讨如何使用Spring4框架与EhCache进行整合,以实现零配置的页面缓存功能。EhCache是一个广泛使用的开源Java缓存解决方案,它提供了高效的内存和磁盘缓存机制,有助于提升应用程序性能。通过...

    Spring+EhCache缓存实例

    **Spring+EhCache缓存实例详解** 在现代的Java企业级应用中,缓存技术扮演着至关重要的角色,它能够显著提升系统性能,减少数据库负载。Spring框架与EhCache的结合,为开发者提供了一种高效、易用的缓存解决方案。...

    基于JGROUPS的ehcache的分布式缓存复制

    在实际应用中,Ehcache的分布式缓存复制还可以与Spring框架集成,通过Spring的缓存抽象层,简化配置和使用。此外,Ehcache提供了丰富的API,允许开发者在运行时动态地添加、移除或更新缓存项,甚至调整缓存策略,以...

    Spring+Ehcache集成

    本篇文章将详细介绍如何在Spring项目中集成Ehcache,以及如何通过Spring的AOP(面向切面编程)实现方法级别的缓存注解。 首先,我们需要在项目中引入Ehcache的依赖。通常,这可以通过在`pom.xml`文件中添加Maven...

    SpringAOP结合ehCache实现简单缓存实例

    在IT行业中,Spring AOP(面向切面编程)和EhCache是两个非常重要的概念,它们在提升应用程序性能和管理缓存方面发挥着关键作用。本文将深入探讨如何结合Spring AOP与EhCache实现一个简单的缓存实例,以便优化Java...

    springMVC+Ehcache的各级缓存(包括页面缓存)

    在IT行业中,缓存技术是提高系统性能的关键因素之一,特别是在高并发、大数据量的场景下。SpringMVC和Ehcache的结合使用,能够构建一个高效、灵活的多级缓存系统,其中包括页面缓存。下面将详细介绍SpringMVC与...

    ehcache二级缓存配置文件

    2. 在Spring配置文件中配置Ehcache缓存管理器。 3. 在需要缓存的方法或类上添加`@Cacheable`、`@CacheEvict`等注解。 4. 可选:配置缓存切面,如`@EnableCaching`。 **5. 性能优化** - 选择合适的缓存策略(LRU、...

    Spring Boot的EhCache缓存使用.docx

    在Spring Boot应用中,缓存是提升性能的关键技术之一。默认情况下,Spring Boot的`@EnableCaching`注解会使用`ConcurrentHashMap`作为基本的缓存管理器。然而,对于生产环境,我们通常需要更强大的缓存解决方案,如...

    SpringBoot 集成Ehcache实现缓存

    下面将详细介绍如何在一个Spring Boot项目中集成并使用Ehcache缓存。 ##### 1. 创建项目 首先,使用IDEA创建一个Maven类型的Spring Boot项目。确保项目结构符合Spring Boot的标准。 ##### 2. 数据库初始化 为了...

    Ehcache整合Spring使用页面、对象缓存

    在Spring框架中整合Ehcache,可以实现页面和对象级别的缓存管理,从而优化Web应用的响应速度。下面将详细介绍Ehcache与Spring的整合及其在页面和对象缓存中的应用。 一、Ehcache简介 Ehcache是基于内存的分布式缓存...

    spring整合ehCache

    Spring整合EhCache是将EhCache作为一个缓存解决方案与Spring框架进行集成,以提高应用程序的性能和效率。EhCache是一款开源、轻量级的Java缓存库,广泛用于缓存中间件,以减少数据库访问,提升系统响应速度。 在...

    spring+ehcache

    在IT行业中,Spring框架是Java企业级应用开发的首选,而Ehcache则是一个流行的、高性能的缓存系统。本文将深入探讨如何将Ehcache与Spring进行整合,以提高应用程序的性能和效率,主要基于提供的"spring+ehcache"入门...

    spring-ehcache-redis两级缓存

    (见下图,为了减少get这几条网络传输,我们会在每个应用服务器上增加本地的ehcache缓存作为二级缓存,即第一次get到的数据存入ehcache,后面output输出即可从本地ehcache中获取,不用再访问redis了,所以就减少了...

Global site tag (gtag.js) - Google Analytics