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

本文介绍如何使用Hibernate 3.2的二级缓存优化find方法的性能,通过配置Spring及EHCache实现对常用实体类查询结果的缓存。

总体思路:使用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>
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值