0 0

spring整合ehcache缓存不了数据5

大部分按照这个帖子上面说的做的http://www.cnblogs.com/lcuzhanglei/archive/2012/05/31/2528124.html,
但是数据就是缓存不了,每次测试都访问数据库。网上也没搜到答案
这个是我的ehcache.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>  
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true"  
    monitoring="autodetect">  
    <diskStore path="d:\\temp\\cache"/>  
    <defaultCache  
            maxElementsInMemory="10000"  
            eternal="false"  
            timeToIdleSeconds="120"  
            timeToLiveSeconds="120"  
            overflowToDisk="true"  
            maxElementsOnDisk="10000000"  
            diskPersistent="false"  
            diskExpiryThreadIntervalSeconds="120"  
            memoryStoreEvictionPolicy="LRU"  
            />  
     <cache name="demoCache"  
           maxElementsInMemory="10000"  
           maxElementsOnDisk="1000"  
           eternal="false"  
           overflowToDisk="true"  
           diskSpoolBufferSizeMB="20"  
           timeToIdleSeconds="300"  
           timeToLiveSeconds="600"  
           memoryStoreEvictionPolicy="LFU"  
            />  
</ehcache>  

spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="
			http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
			http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
			http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"
			default-lazy-init="true">
	<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
		<property name="configLocation">
			<value>classpath:ehcache.xml</value>
		</property>
	</bean>
	<bean id="deptCache" class="org.springframework.cache.ehcache.EhCacheFactoryBean">
		<property name="cacheManager" ref="cacheManager"/>
		<property name="beanName" value="democache"/>
	</bean>
	<bean id="cacheInterceptor" class="com.xiaolu.interceptor.MethodCacheInterceptor">
		<property name="cache" ref="deptCache"/>
	</bean>
	<bean id="methodCachePointcutAdvisor" class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">
		<property name="advice" ref="cacheInterceptor"/>
		<property name="patterns">
			<list>
				<value>.*getAllDept</value>
			</list>
		</property>
	</bean>
	<bean id="deptService" class="com.xiaolu.service.DeptService"/>
	<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="target" ref="deptService"/>
		<property name="interceptorNames">
			<list>
				<value>methodCachePointcutAdvisor</value>
			</list>
		</property>
	</bean>
</beans>

监听器
package com.xiaolu.interceptor;

import java.io.Serializable;

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

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

public class MethodCacheInterceptor implements MethodInterceptor,InitializingBean {
	private Cache cache;
	@Override
	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;
		String cacheKey = getCacheKey(targetName, methodName, arguments);
		System.out.println("cacheKey:"+cacheKey);
		Element element = null;
		System.out.println("-----1-----");
		synchronized(this){
			element = cache.get(cacheKey);
			if(null == element){
				result = invocation.proceed();
				System.out.println("-----2----");
				element = new Element(cacheKey, (Serializable)result);
				cache.put(element);
			}
		}
		return element.getValue();
	}

	@Override
	public void afterPropertiesSet() throws Exception {
		Assert.notNull(cache,
				"A cache is required. Use setCache(Cache) to provide one.");
	}
	private String getCacheKey(String targetName,String methodName,Object[] arguments){
		StringBuilder sb = new StringBuilder();
		sb.append(targetName).append(".").append(methodName);
		if((arguments.length !=0)&&(arguments != null)){
			for(int i=0;i<arguments.length;i++){
				sb.append(".").append(arguments[i]);
			}
		}
		return sb.toString();
	}

	public void setCache(Cache cache) {
		this.cache = cache;
	}

}


访问数据库的类
package com.xiaolu.service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.xiaolu.pojo.Dept;

public class DeptService {
	Connection conn = null;
	PreparedStatement pstmt = null;
	ResultSet rs = null;
	public List<Dept> getAllDept(){
		String sql = "select * from dept";
		List<Dept> list = new ArrayList<Dept>();
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:orcl","scott","tiger");
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			while(rs.next()){
				Dept dept = new Dept();
				dept.setDeptno(rs.getInt("deptno"));
				dept.setDname(rs.getString("dname"));
				dept.setLoc(rs.getString("loc"));
				list.add(dept);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return list;
	}
}


实体类
package com.xiaolu.pojo;

import java.io.Serializable;

public class Dept implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int deptno;
	private String dname;
	private String loc;
	public int getDeptno() {
		return deptno;
	}
	public void setDeptno(int deptno) {
		this.deptno = deptno;
	}
	public String getDname() {
		return dname;
	}
	public void setDname(String dname) {
		this.dname = dname;
	}
	public String getLoc() {
		return loc;
	}
	public void setLoc(String loc) {
		this.loc = loc;
	}
	
}


测试代码
package test;

import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.xiaolu.pojo.Dept;
import com.xiaolu.service.DeptService;

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

public class Test {
	public static void main(String[] args) {
		
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		DeptService service = (DeptService) context.getBean("proxyFactoryBean");
		List<Dept> list = service.getAllDept();
		for(Dept dept:list){
			System.out.println(dept.getDname());
		}
	}
}
2013年3月13日 18:42

3个答案 按时间排序 按投票排序

0 0

采纳的答案

你测试方法有问题,在测试类里面new出ClassPathXmlApplicationContext,但是你下面用来从数据库取数据在同一个ClassPathXmlApplicationContext下只有一次,怎么可能会有缓存呢?,等于是每次都是new的不同的ClassPathXmlApplicationContext,每次都是new的不同的cache对象,你需要在测试中连续取几次数据。这样就可以看到结果

2013年3月14日 21:23
0 0


      ApplicationContext context = new  ClassPathXmlApplicationContext("applicationContext.xml");  
        DeptService service = (DeptService) context.getBean("proxyFactoryBean");  
       for(int i=0;i<5;i++){
         List<Dept> list = service.getAllDept();  
        for(Dept dept:list){  
            System.out.println(dept.getDname());  
        } 
     }

在数据库查询方法中 添加日志信息  看查询了几次数据库

2013年3月15日 13:54
0 0

缓存时间设置太短了
           timeToIdleSeconds="300"   
           timeToLiveSeconds="600" 

============================================
           timeToIdleSeconds="30000"   
           timeToLiveSeconds="60000"

2013年3月14日 10:39

相关推荐

    Spring+Ehcache集成

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

    spring + ehcache + redis两级缓存

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

    spring整合EhCache 的简单例子

    现在我们来详细探讨如何在Spring应用中集成EhCache以及相关知识点。 1. **EhCache简介** - EhCache 是一个广泛使用的Java缓存解决方案,支持本地内存缓存和分布式缓存。 - 它提供了线程安全、可配置的缓存策略,...

    Spring+EhCache缓存实例

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

    整合spring 和ehcache

    配置ehcache缓存,存储内存的设置,与spring 的整合等

    spring整合ehcache的完整用例

    Spring整合Ehcache是将Ehcache作为Spring应用的缓存解决方案,以提高应用程序的性能和效率。Ehcache是一个广泛使用的开源Java分布式缓存,它支持内存和磁盘存储,具有缓存热备、缓存复制等功能。下面将详细介绍...

    spring+ehcache示例整合Demo

    在这个"spring+ehcache示例整合Demo"中,我们将会探讨如何将Ehcache集成到Spring框架中,以实现高效的缓存管理。 首先,我们需要在项目的`pom.xml`文件中引入Ehcache和Spring的依赖。Ehcache通常使用的是`org....

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

    本篇文章将详细探讨如何在Spring框架中集成并实现基于方法的缓存机制,利用Ehcache来优化数据访问。 首先,我们需要理解Spring的AOP概念,AOP允许我们定义横切关注点,如日志、事务管理或,正如在这个案例中,缓存...

    spring整合ehCache

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

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

    通过Spring4的Java配置方式,我们可以轻松地集成EhCache到我们的项目中,实现对页面整体或局部内容的缓存。 首先,我们需要在项目中添加EhCache和Spring的相关依赖。确保`pom.xml`文件中包含以下依赖: ```xml ...

    spring整合EhCache 简单例子

    Spring整合EhCache是一个常见的缓存管理方案,尤其在企业级Java应用中广泛使用。Spring框架提供了对多种缓存技术的支持,包括EhCache,这使得我们能够在Spring应用中轻松地实现数据缓存,提高系统性能。下面我们将...

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

    Spring对ehCache的支持使得集成更加简便,我们可以利用Spring的缓存抽象来管理ehCache实例,包括设置缓存策略、大小限制等。 为了实现数据更新时的缓存刷新,我们可以利用Spring的事件驱动模型。当创建、更新或删除...

    spring2.5整合ehcache2.0使用

    Ehcache是一款广泛使用的开源Java缓存解决方案,而Spring框架则为它提供了一个方便的集成层,使得我们可以在不修改核心业务代码的情况下轻松地添加缓存功能。 首先,我们需要在项目中引入Ehcache和Spring的相关依赖...

    Spring整合EhCache详细教程(史上最全)

    #### Spring整合EhCache缓存 EhCache是一种广泛使用的纯Java实现的缓存系统,具有高性能和易于使用的特性。Spring框架通过`EhCacheCacheManager`提供了一种无缝整合EhCache的方式。 1. **依赖引入**:确保项目中...

    Struts2+Spring+Hibernate+Ehcache+AJAX+JQuery+Oracle 框架集成用户登录注册Demo工程

    1.通过google ehcache-spring-annotatios.jar自动注解方式实现整合Spring+Ehcache。 2.Action里通过struts2-spring-plugin.jar插件自动根据名字注入。 3.Ajax无刷新异步调用Struts2,返回Json数据,以用户注册为例。...

    SpringBoot 集成Ehcache实现缓存

    ### Spring Boot集成Ehcache实现缓存 #### 一、Ehcache简介 Ehcache是一个高效的纯Java进程内缓存框架,以其快速且轻便的特点而被广泛应用于各种应用场景中,尤其在Java EE和轻量级容器环境中更是受到青睐。...

    spring+ehcache demo

    本示例"spring+ehcache demo"将带你深入理解如何在Spring环境中集成并使用Ehcache进行数据缓存。 Ehcache是一款广泛使用的开源Java缓存库,它提供了内存和磁盘存储,支持分布式缓存,并且可以与Spring框架无缝结合...

    Spring与ehcache结合使用

    通过上述步骤,我们可以在Spring项目中成功集成ehcache,并利用Spring提供的缓存注解来方便地管理缓存。这种集成不仅可以显著提高应用的性能,还能简化代码的复杂度,使得开发者能够更加专注于业务逻辑的编写。希望...

    详解Spring整合Ehcache管理缓存

    本文将首先介绍 Ehcache 的基本使用,然后讲解如何在 Spring 中集成 Ehcache 进行缓存管理。 ## Ehcache 基本概念 Ehcache 是一个纯 Java 实现的进程内缓存框架,具有快速响应、内存高效利用等特点。在 Hibernate ...

    Ehcache集成Spring的使用(转载)

    **正文** Ehcache 是一个开源的 Java 缓存库,它提供了本地内存缓存以及分布式缓存解决方案。在 Spring 框架中,...通过上述步骤,开发者可以轻松地将 Ehcache 引入到 Spring 应用中,并实现高效的数据缓存策略。

Global site tag (gtag.js) - Google Analytics