最近结束了一个小型网站项目,主要功能就是一个文章系统,为了提升站点性能,我在首页上使用了OSCache,在访问首页时,性能的确有不小的提升(具体数据见《JMeter小实验——JSP性能简单测试》),但我对此并不满足,打算使用Hibernate的二级缓存来优化访问文章和栏目时的速度。
        Hibernate的二级缓存有很多选择,我选择了默认的EHCache。它的配置十分简单,只要在Hibernate配置里加入

hibernate.cache.provider_class = net.sf.hibernate.cache.EhCacheProvider

然后在Classpath里加入EHCache.xml文件,我的文件内容如下:

< ehcache >
    
< diskStore path = " java.io.tmpdir " />
    
< defaultCache
        maxElementsInMemory
= " 1000 "
        eternal
= " false "
        timeToIdleSeconds
= " 600 "
        timeToLiveSeconds
= " 600 "
        overflowToDisk
= " false "
        
/>
</ ehcache >

        JavaEye上的《hibernate二级缓存攻略》对这些属性有如下说明:

eternal表示缓存是不是永远不超时

timeToLiveSeconds是缓存中每个元素(这里也就是一个POJO)的超时时间,如果eternal
= " false " ,超过指定的时间,这个元素就被移走了。

timeToIdleSeconds是发呆时间,是可选的。当往缓存里面put的元素超过500个时,如果overflowToDisk
= " true " ,就会把缓存中的部分数据保存在硬盘上的临时文件里面。

注意:我的配置中最大元素设成了1000。
        如果希望每个缓存的POJO有自己的配置,可以把defaultCache换成cache name="com.xxx.pojo.Foo"。
        完成了EHCache.xml的配置,接下来在每个要被缓存的POJO映射 文件里加入

< cache usage = " read-write "   />

其中read-write是缓存策略,Hibernate还有read-only、nonstrict-read-write和transactional这些策略以供选择。
        配置完成后,我用JMeter测试,发现头两次访问的时间很长,但随后的访问速度有很大提升,数字上相差两位呢。虽然在实际使用时还有网络等因素会影响站点的访问,不过总的来说对于这样的小型文章系统,二级缓存的使用还是对整体性能有帮助的。最后要做的就是根据实际使用情况,适当调整一下缓存设置,我用SpringAOP建立了一个处理日志的拦截器,记录访问量和访问间隔,先让它运行一段时间,随后根据日志情况对缓存作调整。