转Spring+Hibernate+EHcache配置(三)

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

然后,在将Cache和两个拦截器配置到Spring,这里没有使用2.0里面AOP的标签。 
cacheContext.xml

Java代码 
<?xml version="1.0"
encoding="UTF-8"?>    
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd">    
<beans>    
   
<!-- 引用ehCache的配置 -->    
   
<bean id="defaultCacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">    
     
<property
name="configLocation">    
       
<value>ehcache.xml</value>    
     
</property>    
   
</bean>    
        
   
<!-- 定义ehCache的工厂,并设置所使用的Cache name
-->    
    <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>    
   
   
<!-- find/create cache拦截器
-->    
    <bean
id="methodCacheInterceptor"
class="com.co.cache.ehcache.MethodCacheInterceptor">    
     
<property
name="cache">    
       
<ref local="ehCache"
/>    
     
</property>    
   
</bean>    
    <!-- flush
cache拦截器 -->    
    <bean
id="methodCacheAfterAdvice"
class="com.co.cache.ehcache.MethodCacheAfterAdvice">    
     
<property
name="cache">    
       
<ref local="ehCache"
/>    
     
</property>    
   
</bean>    
        
   
<bean id="methodCachePointCut"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">    
     
<property
name="advice">    
       
<ref
local="methodCacheInterceptor"/>    
     
</property>    
     
<property
name="patterns">    
       
<list>    
           
<value>.*find.*</value>    
           
<value>.*get.*</value>    
       
</list>    
     
</property>    
   
</bean>    
    <bean
id="methodCachePointCutAdvice"
class="org.springframework.aop.support.RegexpMethodPointcutAdvisor">    
     
<property
name="advice">    
       
<ref
local="methodCacheAfterAdvice"/>    
     
</property>    
     
<property
name="patterns">    
       
<list>    
         
<value>.*create.*</value>    
         
<value>.*update.*</value>    
         
<value>.*delete.*</value>    
       
</list>    
     
</property>    
   
</bean>    
</beans> 

上面的代码最终创建了两个"切入点",methodCachePointCut和methodCachePointCutAdvice,分别用于拦截不同方法名的方法,可以根据需要任意增加所需要拦截方法的名称。 
需要注意的是

Java代码 
<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> 
<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>

如果cacheName属性内设置的name在ehCache.xml中无法找到,那么将使用默认的cache(defaultCache标签定义).

事实上到了这里,一个简单的Spring + ehCache
Framework基本完成了,为了测试效果,举一个实际应用的例子,定义一个TestService和它的实现类TestServiceImpl,里面包含

两个方法getAllObject()和updateObject(Object
Object),具体代码如下 
TestService.java

Java代码 
package
com.co.cache.test;    
   
import
java.util.List;    
   
public
interface TestService {    
    public
List
getAllObject();    
   
   
public void updateObject(Object
Object);    


TestServiceImpl.java

Java代码 
package
com.co.cache.test;    
   
import
java.util.List;    
   
public class
TestServiceImpl implements
TestService    
{    
   
public List getAllObject()
{    
       
System.out.println("---TestService:Cache内不存在该element,查找并放入Cache!");    
       
return null;    
   
}    
   
    public
void updateObject(Object Object)
{    
       
System.out.println("---TestService:更新了对象,这个Class产生的cache都将被remove!");    
   
}    


使用Spring提供的AOP进行配置 
applicationContext.xml

Java代码 
<?xml version="1.0"
encoding="UTF-8"?>    
<!DOCTYPE beans PUBLIC
"-//SPRING//DTD BEAN//EN" "
http://www.springframework.org/dtd/spring-beans.dtd">    
   
<beans>    
   
<import
resource="cacheContext.xml"/>    
        
   
<bean id="testServiceTarget"
class="com.co.cache.test.TestServiceImpl"/>    
        
   
<bean id="testService"
class="org.springframework.aop.framework.ProxyFactoryBean">    
     
<property
name="target">    
         
<ref
local="testServiceTarget"/>    
     
</property>    
     
<property
name="interceptorNames">    
       
<list>    
         
<value>methodCachePointCut</value>    
         
<value>methodCachePointCutAdvice</value>    
       
</list>    
     
</property>    
   
</bean>    
</beans> 

这里一定不能忘记import cacheContext.xml文件,不然定义的两个拦截器就没办法使用了。

最后,写一个测试的代码 
MainTest.java

Java代码 
package
com.co.cache.test;    
   
import
org.springframework.context.ApplicationContext;    
import
org.springframework.context.support.ClassPathXmlApplicationContext;    
   
public
class MainTest{    
    public static void
main(String
args[]){    
       
String DEFAULT_CONTEXT_FILE =
"/applicationContext.xml";    
       
ApplicationContext context = new
ClassPathXmlApplicationContext(DEFAULT_CONTEXT_FILE);    
       
TestService testService =
(TestService)context.getBean("testService");    
   
       
System.out.println("1--第一次查找并创建cache");    
       
testService.getAllObject();    
            
       
System.out.println("2--在cache中查找");    
       
testService.getAllObject();    
            
       
System.out.println("3--remove
cache");    
       
testService.updateObject(null);    
            
       
System.out.println("4--需要重新查找并创建cache");    
       
testService.getAllObject();    
   
}       


运行,结果如下

Java代码 
1--第一次查找并创建cache    
---TestService:Cache内不存在该element,查找并放入Cache!    
2--在cache中查找    
3--remove
cache    
---TestService:更新了对象,这个Class产生的cache都将被remove!    
4--需要重新查找并创建cache    
---TestService:Cache内不存在该element,查找并放入Cache! 

可以看到,第一步执行getAllObject(),执行TestServiceImpl内的方法,并创建了cache,在第二次执行getAllObject()方法时,由于cache有该方法的缓存,直接从cache中get出方法的结果,所以没有打印出TestServiceImpl中的内容,而第三步,调用了updateObject方法,和TestServiceImpl相关的cache被remove,所以在第四步执行时,又执行TestServiceImpl中的方法,创建Cache。

注意的问题

我们知道,Cache为ehcache.XML配置文件里面所定义的缓存类别,获取某一特定的缓存类别的方法如下:
Cache
cache=
cacheManager.getCache(cacheName);
cacheName为想获取的缓存类别名。然后象下面方法把某一对象放入上面定义的缓存:
cache.put(new
Element(key,(Serializable)value));
key为
放入该缓存中的对象的索引值,value为放入该缓存中key所对应的对象。我们看到,放入缓存中的value必须序列化,Java原生类型 char、int
,原生类型的包装类String、Character、Integer、Number...和集合List的实现类ArrayList都已经实现了Serializable接口,它们都可以直接放到缓存中。这里要注意的是,在方法返回值中经常用到的Iterator,并没有实现Serializable接口,所以Cache
不能缓存返回值类型为Iterator的方法。
   
还有一点要注意的是,如果我们要做缓存的方法是在bean的生命周期的初始化阶段调用的(例如setter,init),此时方法缓存拦截器还没被调用执行,那么缓存将不起作用,如做了下面的配置:
<bean
id="OrganizationManagerMethodCache"
class="org.springFramework.aop.framework.ProxyFactoryBean">
   
<property name="target">
       
<bean class="com.wzj.rbac.ServiceFacade.OrganizationManager"
init-method="init"
autowire="byName"/>     
   
</property>
    <property
name="interceptorNames">
      
<list>
           
<value>methodCachePointCut</value>
       
</list>
    
</property>
</bean>
在init初始方法里面调用的缓存方法将失效。

时间: 2024-08-11 07:49:01

转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配置(二)

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

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

Maven 工程下 Spring MVC 站点配置 (三) C3P0连接池与@Autowired的应用

Maven 工程下 Spring MVC 站点配置 (一) Maven 工程下 Spring MVC 站点配置 (二) Mybatis数据操作 前两篇文章主要是对站点和数据库操作配置进行了演示,如果单单实现这两个需求的话,那么基本足够,但是很多时候一个网站除了仅仅能够访问数据库是不够的,它还需要对性能以及更简化的步骤有着更多的要求,这一篇重点就是帮助我们如何去实现数据连接池管理与更简化便利的开发步骤. 如果你觉得自己能写出更高效率的连接池,那你可以不需要这篇文章了,我更建议你可以去开源组织毛遂自

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

Hibernate+EhCache配置二级缓存

步骤: 第一步:加入ehcache.jar 第二步: 在src目录下新建一个文件,名为:ehcache.xml 第三步:在hibernate配置文件的<session-factory>下配置 配置的具体信息: ehcache.xml的具体配置: <?xml version="1.0" encoding="UTF-8"?> <!-- maxEntriesLocalHeap: 在内存中缓存的element的最大数目. maxEntriesL