总体思路:使用Hibernate3.2的二级缓存,解决使用频率最多的find(Classclz,Objectid)方法的缓存。一、使用Hibernat" />

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

系统 1618 0
<iframe align="top" marginwidth="0" marginheight="0" src="http://www.zealware.com/csdnblog01.html" frameborder="0" width="728" scrolling="no" height="90"></iframe>

总体思路:使用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>
<property><span style="COLOR: #0000ff">="database"</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="MYSQL"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="showSql"</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="generateDdl"</span><span style="COLOR: #ff0000">value</span><span style="COLOR: #0000ff">="false"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"></span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #008000"><!--</span><span style="COLOR: #008000"><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><propertyname="loadTimeWeaver"><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><bean<br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />class="org.springframework.instrument.classloading.SimpleLoadTimeWeaver"/><br /><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /></property></span><span style="COLOR: #008000">--></span><span style="COLOR: #000000"></span></span></span></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 > <!--</span><span style="COLOR: #008000">暂时不开querycache</span><span style="COLOR: #008000">-->

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

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


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

<!--</span><span style="COLOR: #008000">以下是为Spring提供的方法调用结果缓存</span><span style="COLOR: #008000">-->

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><span style="COLOR: #0000ff">=com.easyjf.cms.service.impl.CmsManageServiceImpl&gt;</span></bean>
<property><span style="COLOR: #0000ff">="newsAuthorDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsAuthorDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="newsDocDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsDocDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="newsDirDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsDirDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="newsSourceDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsSourceDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="reviewDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsRivewDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">EHCACHE:CACHING</span><span style="COLOR: #ff0000">cachename</span><span style="COLOR: #0000ff">="CMSCache"</span><span style="COLOR: #ff0000">methodname</span><span style="COLOR: #0000ff">="get*"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">EHCACHE:CACHING</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">EHCACHE:FLUSHING</span><span style="COLOR: #ff0000">methodname</span><span style="COLOR: #0000ff">="update*"</span><span style="COLOR: #ff0000">cachenames</span><span style="COLOR: #0000ff">="CMSCache"</span><span style="COLOR: #ff0000">when</span><span style="COLOR: #0000ff">="before"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">EHCACHE:FLUSHING</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"></span><span style="COLOR: #800000">EHCACHE:PROXY</span><span style="COLOR: #0000ff">&gt;</span></span></span></span></span></span></span></property>


调整前对照:

BEAN class =com.easyjf.cms.service.impl.CmsManageServiceImpl id =cmsManageService>
<property><span style="COLOR: #0000ff">="newsAuthorDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsAuthorDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="newsDocDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsDocDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="newsDirDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsDirDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="newsSourceDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsSourceDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"><br><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top"></span><span style="COLOR: #0000ff"><span style="COLOR: #800000">property</span><span style="COLOR: #ff0000">name</span><span style="COLOR: #0000ff">="reviewDao"</span><span style="COLOR: #ff0000">ref</span><span style="COLOR: #0000ff">="newsRivewDao"</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #800000">property</span><span style="COLOR: #0000ff">&gt;</span><span style="COLOR: #000000"></span></span></span></span></span></property>


为了让Spring配置文件能识别并处理 EHCACHE:XXX > 这个标签,需要在beans中进行schem声明,如下所示: BR > 另外在spring配置文件中再增加 EHCACHE:CONFIG configlocation = "classpath:ehcache.xml" > EHCACHE:CONFIG > ,以便Spring能找到Cache配置文件。 EHCACHE:XXX >

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" xmlns:ehcache ="http://www.springmodules.org/schema/ehcache" xsi:schemalocation ="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springmodules.org/schema/ehcachehttp://www.springmodules.org/schema/cache/springmodules-ehcache.xsd" > BEANS >


7、以上只是基本的配置,cache运行的具体性能,还需要根据实际的数据量及并发量等进行更加细致的调整。

8、另外EasyJWeb还将会提供一个页面结果缓存,直接缓存Action的执行结果,这样就可以解决访问得最多,属于严重性能瓶颈的问题。比如ec-brand.ejf、index.ejf等。这一功能将在9月15号前推出。

9、一些必要的页面,需要增加静态文件生成功能。(逐渐调整)

注释:

  由于发现Spring2.06版本与当前我们使用的版本存在一些冲突。而且跟EasyJWeb中的maven混合编译的时候存在一些问题,因此暂时取消使用Spring的方法Cache,而只使用Hibernate的Cache及EasyJWeb的缓存配合。EasyJWeb的缓存简单机制已经实现,直接在基于AbstractCmdAction的Action中,在要缓存的Command中使用缓存标签@WebCache即可。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1906489


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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论