EasyJWeb+JPA(Hibernate3.2)+Spring2构架缓存技术

总体思路:使用Hibernate3.2的二级缓存,解决使用频率最多的find(Class clz,Object id)方法的缓存。

一、使用Hibernate3.2的二级缓存功能,只开取针对id查找实体的缓存,不开启基于list查询的缓存。
技术调整如下:
1、升级Spring2的版本号,升级为2.06,更新spring.jar、spring-aspects.jar、spring-mock.jar,为了使用spring modules中提供的cache功能,增加了spring-modules-cache.jar。以上包已经添加到svn中。

2、修改jpa-base.xml中的entityManagerFactory Bean的配置信息,把对loadTimeWeaver属性的注入注释掉。

< BEAN  class =org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean  name ="entityManagerFactory" ></ BEAN >   
  
< property  name ="persistenceXmlLocation"  value ="classpath:persistence.xml" ></ property >   
  
< property  name ="dataSource"  ref ="dataSource" ></ property >   
  
< property  name ="jpaVendorAdapter" >   
   
< BEAN  class =org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter></BEAN>  
    
<property name ="database"  value ="MYSQL" ></ property >   
    
< property  name ="showSql"  value ="false" ></ property >   
    
< property  name ="generateDdl"  value ="false" ></ property >   
 
  
</ property >   
  
<!--    
  <property name="loadTimeWeaver">  
   <bean  
    class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver" />  
  </property>
-->   


在persistence.xml文件中,添加如下的配置信息,开启Hibernate的二级缓存: 

< property  name ="hibernate.cache.provider_class"  value ="org.hibernate.cache.EhCacheProvider" ></ property >   
< property  name ="hibernate.cache.use_query_cache"  value ="false" ></ property > <!-- 暂时不开query cache -->

3、在src目录下增加ehcache.xml,设置cache的配置信息,默认情况下可以考虑给一些常用的Entity类设置一个单独的cache区域,如下所示:

< CACHE  name ="com.easyjf.security.Resource"  maxelementsinmemory ="1000"  eternal ="false"  overflowtodisk ="false"  memorystoreevictionpolicy ="LFU" ></ CACHE >   
<!-- 配置信息的说明如下:   
缺省缓存配置。CacheManager 会把这些配置应用到程序中。   
        下列属性是 defaultCache 必须的:   
  
        maxInMemory           - 设定内存中创建对象的最大值。   
        eternal                        - 设置元素(译注:内存中对象)是否永久驻留。如果是,将忽略超   
                                              时限制且元素永不消亡。   
        timeToIdleSeconds  - 设置某个元素消亡前的停顿时间。   
                                              也就是在一个元素消亡之前,两次访问时间的最大时间间隔值。   
                                              这只能在元素不是永久驻留时有效(译注:如果对象永恒不灭,则   
                                              设置该属性也无用)。   
                                              如果该值是 0 就意味着元素可以停顿无穷长的时间。   
        timeToLiveSeconds - 为元素设置消亡前的生存时间。   
                                               也就是一个元素从构建到消亡的最大时间间隔值。   
                                               这只能在元素不是永久驻留时有效。   
        overflowToDisk        - 设置当内存中缓存达到 maxInMemory 限制时元素是否可写到磁盘   
                                               上。   
        
-->


4、然后修改Domain对象,对于要使用缓存的的Entity,在类声明前加上如下的标签:<BR>@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE),此处usage的值还需要根据应用情况进行必要的调整。<BR> </P><P>5、暂时使用ehcache作为Spring modules的cache。在ehcache.xml文件中继续配置用于为spring提供方法调用结果的缓存。大致如下:

<!-- 以下是为Spring提供的方法调用结果缓存 -->   
      
 
< CACHE  name ="CMSCache"  maxelementsinmemory ="5000"  eternal ="false"  overflowtodisk ="true"  memorystoreevictionpolicy ="LFU" ></ CACHE >   
 
< CACHE  name ="ECCache"  maxelementsinmemory ="5000"  eternal ="false"  overflowtodisk ="true"  memorystoreevictionpolicy ="LFU" ></ CACHE >


6、然后在具体的Service类中配置缓存。使用了AOP,需要修改spring的配置文件,比如cms-core.xml中为了给ICmsManageService的get*方法添加结果缓存,调整如下:

< EHCACHE:PROXY  id =cmsManageService>     
 
<BEAN class =com.easyjf.cms.service.impl.CmsManageServiceImpl></BEAN>     
  
<property name ="newsAuthorDao"  ref ="newsAuthorDao" ></ property >   
  
< property  name ="newsDocDao"  ref ="newsDocDao" ></ property >   
  
< property  name ="newsDirDao"  ref ="newsDirDao" ></ property >   
  
< property  name ="newsSourceDao"  ref ="newsSourceDao" ></ property >   
  
< property  name ="reviewDao"  ref ="newsRivewDao" ></ property >   
    
 
< EHCACHE:CACHING  cachename ="CMSCache"  methodname ="get*" ></ EHCACHE:CACHING >   
 
< EHCACHE:FLUSHING  methodname ="update*"  cachenames ="CMSCache"  when ="before" ></ EHCACHE:FLUSHING >   
 
</ EHCACHE:PROXY >


调整前对照: 

< BEAN  class =com.easyjf.cms.service.impl.CmsManageServiceImpl  id =cmsManageService></BEAN>     
  
<property name ="newsAuthorDao"  ref ="newsAuthorDao" ></ property >   
  
< property  name ="newsDocDao"  ref ="newsDocDao" ></ property >

你可能感兴趣的:(spring,bean,Hibernate,cache,jpa)