- 浏览: 695817 次
- 性别:
- 来自: 杭州
文章分类
最新评论
先描述下我的环境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.
2.定义一个接口CityCache
3.定义数据类CityData,
4.市缓存实现CityCacheMemoryImpl
5.ehcache.xml同时把ehcache.xsd放到同一目录
6.Spring 配置文件夹applicationContext.xml
7.测试用例CityCacheTest
有什么不足的地方请高人指点
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;
}
}
/**
* 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);
}
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);
}
}
*
*/
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()方法重要,要加载没有的内容*
*/
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;
}
}
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>
<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>
<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);
}
}
*
*/
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);
}
}
有什么不足的地方请高人指点
发表评论
-
Ant + hibernate 生成*.sql
2007-03-27 20:58 1191一开始没有在<schemaexport />里加q ... -
初用 hsqldb
2007-04-28 15:31 1302今天初了下 hsqldb下载 hsqldbhttp://sou ... -
build-blank.xml
2007-05-05 14:32 1059第一个项目都要写 build.xml 一些基本的东西先写好 & ... -
iBatis 对 hsql 的 selectKey
2007-06-09 22:21 1564call identity(); <insert ... -
utf-8编码页面 与 fileupload 乱码问题
2007-07-26 17:13 3600我的页面都是UTF-8,所有请求中文都没有问题,但 ... -
ehcahe 了解
2007-08-02 14:19 2572想学习缓存框架已经很久了,一直没做到,可能是太忙了 ... -
unable to find resource velocity in spring
2007-08-18 02:11 6132Velocity 邮件模板在Spring 中发邮件报u ... -
send email with velocity and spring 完整示例
2007-08-21 19:43 1618由于项目里要发邮件,用了spring 和 veloci ... -
dom4j 读 xml 文件
2007-09-05 23:58 1556由于要保存一些项目中只有一个而且很少改的,用数据库存 ... -
log4j.properties
2008-04-11 12:01 1193log4j.properties文件 log4j.appen ... -
dom4j 写UTF-8的xml乱码问题
2007-09-09 09:19 9060xhy0422 博客里 http://xhy0422.ite ...
相关推荐
当我们谈论“Spring + Ehcache + Redis”两级缓存时,我们实际上是在讨论如何在Java环境中利用Spring框架来集成Ehcache作为本地缓存,并利用Redis作为分布式二级缓存,构建一个高效且可扩展的缓存解决方案。...
在本篇【Spring AOP+ehCache简单缓存系统解决方案】中,我们将探讨如何利用Spring AOP(面向切面编程)和ehCache框架来构建一个高效、简单的缓存系统,以提升应用程序的性能。ehCache是一款流行的开源Java缓存库,它...
Ehcache是一个高性能的、基于Java的进程内缓存解决方案,它被广泛应用于各种Java应用程序,包括Java EE和轻量级容器。Ehcache的主要优势在于它的快速响应、易用性和丰富的缓存策略。它提供了两种级别的缓存存储:...
### Ehcache 整合Spring 使用页面、对象缓存 #### 一、Ehcache简介与特点 Ehcache是一款开源的、高性能的Java缓存框架,它可以用来存储、检索短期数据,以减轻数据库的压力,提高应用程序性能。Ehcache不仅支持...
在IT行业中,Spring框架是Java领域最广泛应用的轻量级框架之一,它为开发者提供了强大的依赖注入(DI)和面向切面编程(AOP)功能。Ehcache则是一款广泛使用的开源缓存解决方案,用于提高应用程序性能,减少数据库...
在本文中,我们将深入探讨如何使用Spring4框架与EhCache进行整合,以实现零配置的页面缓存功能。EhCache是一个广泛使用的开源Java缓存解决方案,它提供了高效的内存和磁盘缓存机制,有助于提升应用程序性能。通过...
**Spring+EhCache缓存实例详解** 在现代的Java企业级应用中,缓存技术扮演着至关重要的角色,它能够显著提升系统性能,减少数据库负载。Spring框架与EhCache的结合,为开发者提供了一种高效、易用的缓存解决方案。...
在实际应用中,Ehcache的分布式缓存复制还可以与Spring框架集成,通过Spring的缓存抽象层,简化配置和使用。此外,Ehcache提供了丰富的API,允许开发者在运行时动态地添加、移除或更新缓存项,甚至调整缓存策略,以...
本篇文章将详细介绍如何在Spring项目中集成Ehcache,以及如何通过Spring的AOP(面向切面编程)实现方法级别的缓存注解。 首先,我们需要在项目中引入Ehcache的依赖。通常,这可以通过在`pom.xml`文件中添加Maven...
在IT行业中,Spring AOP(面向切面编程)和EhCache是两个非常重要的概念,它们在提升应用程序性能和管理缓存方面发挥着关键作用。本文将深入探讨如何结合Spring AOP与EhCache实现一个简单的缓存实例,以便优化Java...
在IT行业中,缓存技术是提高系统性能的关键因素之一,特别是在高并发、大数据量的场景下。SpringMVC和Ehcache的结合使用,能够构建一个高效、灵活的多级缓存系统,其中包括页面缓存。下面将详细介绍SpringMVC与...
2. 在Spring配置文件中配置Ehcache缓存管理器。 3. 在需要缓存的方法或类上添加`@Cacheable`、`@CacheEvict`等注解。 4. 可选:配置缓存切面,如`@EnableCaching`。 **5. 性能优化** - 选择合适的缓存策略(LRU、...
在Spring Boot应用中,缓存是提升性能的关键技术之一。默认情况下,Spring Boot的`@EnableCaching`注解会使用`ConcurrentHashMap`作为基本的缓存管理器。然而,对于生产环境,我们通常需要更强大的缓存解决方案,如...
下面将详细介绍如何在一个Spring Boot项目中集成并使用Ehcache缓存。 ##### 1. 创建项目 首先,使用IDEA创建一个Maven类型的Spring Boot项目。确保项目结构符合Spring Boot的标准。 ##### 2. 数据库初始化 为了...
在Spring框架中整合Ehcache,可以实现页面和对象级别的缓存管理,从而优化Web应用的响应速度。下面将详细介绍Ehcache与Spring的整合及其在页面和对象缓存中的应用。 一、Ehcache简介 Ehcache是基于内存的分布式缓存...
Spring整合EhCache是将EhCache作为一个缓存解决方案与Spring框架进行集成,以提高应用程序的性能和效率。EhCache是一款开源、轻量级的Java缓存库,广泛用于缓存中间件,以减少数据库访问,提升系统响应速度。 在...
在IT行业中,Spring框架是Java企业级应用开发的首选,而Ehcache则是一个流行的、高性能的缓存系统。本文将深入探讨如何将Ehcache与Spring进行整合,以提高应用程序的性能和效率,主要基于提供的"spring+ehcache"入门...
(见下图,为了减少get这几条网络传输,我们会在每个应用服务器上增加本地的ehcache缓存作为二级缓存,即第一次get到的数据存入ehcache,后面output输出即可从本地ehcache中获取,不用再访问redis了,所以就减少了...