转Spring+Hibernate+EHcache配置(二)

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

需要使用Spring来实现一个Cache简单的解决方案,具体需求如下:使用任意一个现有开源Cache
Framework,要求可以Cache系统中Service或则DAO层的get/find等方法返回结果,如果数据更新(使用Create/update/delete方法),则刷新cache中相应的内容。
MethodCacheInterceptor.java

Java代码 
package
com.co.cache.ehcache;    
   
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.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;    
        
       
logger.debug("Find object from cache is " +
cache.getName());    
            
       
String cacheKey = getCacheKey(targetName, methodName,
arguments);    
       
Element element =
cache.get(cacheKey);    
   
       
if (element == null)
{    
           
logger.debug("Hold up method , Get method result and create
cache........!");    
           
result =
invocation.proceed();    
           
element = new Element(cacheKey, (Serializable)
result);    
           
cache.put(element);    
       
}    
        return
element.getValue();    
   
}    
   
   
/**   
     * 获得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))
{    
           
for (int i = 0; i < arguments.length; i++)
{    
               
sb.append(".").append(arguments[i]);    
           
}    
       
}    
        return
sb.toString();    
   
}    
        
   
/**   
     * implement
InitializingBean,检查cache是否为空   
    
*/   
    public void afterPropertiesSet()
throws Exception
{    
       
Assert.notNull(cache, "Need a cache. Please use setCache(Cache) create
it.");    
   
}    
   

上面的代码中可以看到,在方法public Object invoke(MethodInvocation invocation)
中,完成了搜索Cache/新建cache的功能。

Java代码 
Element element =
cache.get(cacheKey); 

这句代码的作用是获取cache中的element,如果cacheKey所对应的element不存在,将会返回一个null值

Java代码 
result = invocation.proceed(); 

这句代码的作用是获取所拦截方法的返回值,详细请查阅AOP相关文档。

随后,再建立一个拦截器MethodCacheAfterAdvice,作用是在用户进行create/update/delete操作时来刷新/remove相关cache内容,这个拦截器实现了AfterReturningAdvice接口,将会在所拦截的方法执行后执行在public
void afterReturning(Object arg0, Method arg1, Object[] arg2, Object
arg3)方法中所预定的操作

Java代码 
package
com.co.cache.ehcache;    
   
import
java.lang.reflect.Method;    
import
java.util.List;    
   
import
net.sf.ehcache.Cache;    
   
import
org.apache.commons.logging.Log;    
import
org.apache.commons.logging.LogFactory;    
import
org.springframework.aop.AfterReturningAdvice;    
import
org.springframework.beans.factory.InitializingBean;    
import
org.springframework.util.Assert;    
   
public
class MethodCacheAfterAdvice implements AfterReturningAdvice,
InitializingBean    
{    
   
private static final Log logger =
LogFactory.getLog(MethodCacheAfterAdvice.class);    
   
   
private Cache
cache;    
   
   
public void setCache(Cache cache)
{    
       
this.cache = cache;    
   
}    
   
    public
MethodCacheAfterAdvice()
{    
       
super();    
   
}    
   
    public
void afterReturning(Object arg0, Method arg1, Object[] arg2, Object arg3) throws
Throwable
{    
        String
className =
arg3.getClass().getName();    
       
List list =
cache.getKeys();    
       
for(int i =
0;i<list.size();i++){    
           
String cacheKey =
String.valueOf(list.get(i));    
           
if(cacheKey.startsWith(className)){    
               
cache.remove(cacheKey);    
               
logger.debug("remove cache " +
cacheKey);    
           
}    
       
}    
   
}    
   
    public
void afterPropertiesSet() throws Exception
{    
       
Assert.notNull(cache, "Need a cache. Please use setCache(Cache) create
it.");    
   
}    
   


上面的代码很简单,实现了afterReturning方法实现自AfterReturningAdvice接口,方法中所定义的内容将会在目标方法执行后执行,在该方法中

Java代码 
String className =
arg3.getClass().getName(); 


的作用是获取目标class的全名,如:com.co.cache.test.TestServiceImpl,然后循环cache的key
list,remove cache中所有和该class相关的element。

随后,开始配置ehCache的属性,ehCache需要一个xml文件来设置ehCache相关的一些属性,如最大缓存数量、cache刷新的时间等等. 
ehcache.xml

Java代码 
<ehcache>    
   
<diskStore
path="c:\\myapp\\cache"/>    
   
<defaultCache    
       
maxElementsInMemory="1000"   
       
eternal="false"   
       
timeToIdleSeconds="120"   
       
timeToLiveSeconds="120"   
       
overflowToDisk="true"   
       
/>    
<cache
name="DEFAULT_CACHE"   
       
maxElementsInMemory="10000"   
       
eternal="false"   
       
timeToIdleSeconds="300000"   
       
timeToLiveSeconds="600000"   
       
overflowToDisk="true"   
       
/>    
</ehcache> 

 

时间: 2024-10-12 08:10:04

转Spring+Hibernate+EHcache配置(二)的相关文章

【转】Spring+Hibernate+EHcache配置(一)

大量数据流动是web应用性能问题常见的原因,而缓存被广泛的用于优化数据库应用.cache被设计为通过保存从数据库里load的数据来减少应用和数据库之间的数据流动.数据库访问只有当检索的数据不在cache里可用时才必要.hibernate可以用两种不同的对象缓存:first-level cache 和 second-level cache.first-level cache和Session对象关联,而second-level cache是和Session Factory对象关联.        

转Spring+Hibernate+EHcache配置(三)

配置每一项的详细作用不再详细解释,有兴趣的请google下 ,这里需要注意一点defaultCache标签定义了一个默认的Cache,这个Cache是不能删除的,否则会抛出No default cache is configured异常.另外,由于使用拦截器来刷新Cache内容,因此在定义cache生命周期时可以定义较大的数值,timeToIdleSeconds="300000" timeToLiveSeconds="600000",好像还不够大? 然后,在将Cac

Spring+Hibernate整合配置 --- 比较完整的spring、hibernate 配置

Spring+Hibernate整合配置 分类: J2EE2010-11-25 17:21 16667人阅读 评论(1) 收藏 举报 springhibernateclassactionservletmysql 在公司一直没有什么机会直接折腾SSH“原生态”的SSH当今比较流行的轻量级的框架,用着公司的框架也是郁闷异常,今天没事整整原来用过的一个项目的配置,发现就算是自己曾经用过的东西,如果较长时间不返过去重新学习,许多你半熟不熟的知识就是异常陌生.下面贴上我的一些配置,暂且权当备份吧. web

Spring + Hibernate 项目配置

希望使用最小的例子,驱动出spring + hibernate集成项目的搭建, 该项目是在spring suit tool 上进行创建,使用其自带图形界面功能编辑bean的xml文件 同时在使用sts中发现,其中有一些小功能方便初学者使用,比如对于spring元素的图形化显示等,下面列出三点: 1. 创建一个spring的bean 配置文件 2. 使用图形界面添加namespace等(选项卡中有下面还有beans/context/tx/...) 3. 工程管理中查看spring相关的元素 可以看

Spring+hibernate事务配置

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans"    xmlns:task="http://www.springframework.org/schema/task"    xmlns:xsi="http://www.w3.org/2001/XMLSchem

Spring Boot日志配置 (二)

支持日志框架:Java Util Logging, Log4J2 and Logback,默认是使用logback 配置方式:默认配置文件配置和引用外部配置文件配置 1.默认配置文件配置 不建议使用:不够灵活,对log4j2等不够友好 # 日志文件名,比如:roncoo.log,或者是 /var/log/roncoo.log logging.file=roncoo.log # 日志级别配置,比如: logging.level.org.springframework=DEBUG logging.l

SpringMVC+Spring+Hibernate+EHCache

1.首先使用maven构建一个web项目,目录结构如下 2.配置pom.xml   <!-- spring  -->     <dependency>         <groupId>org.springframework</groupId>         <artifactId>spring-context</artifactId>         <version>4.1.2.RELEASE</version

spring+hibernate注解配置实例

简单的spring3.2.9和hibernate3的集成配置,有demo供下载.shTest下载 第一步 jdbc.properties配置 driverClassName=com.mysql.jdbc.Driver url=jdbc\:mysql\://localhost\:3306/shtest username=root password=123456 prototypeCount=1 maxActive=100 houseKeepingSleepTime=60000 minimumCon

Spring + hibernate + JPA 配置

最近对hibernate的JPA实现比较感兴趣,在此记录下配置方法,备查. 先上maven依赖包配置,这里使用的是spring3.1.2和hibernate3.6.0 <dependencies>                 <dependency>             <groupId>org.hibernate</groupId>             <artifactId>hibernate-entitymanager</