最近結(jié)束了一個(gè)小型網(wǎng)站項(xiàng)目,主要功能就是一個(gè)文章系統(tǒng),為了提升站點(diǎn)性能,我在首頁(yè)上使用了OSCache,在訪問首頁(yè)時(shí),性能的確有不小的提升(具體數(shù)據(jù)見《JMeter小實(shí)驗(yàn)——JSP性能簡(jiǎn)單測(cè)試》),但我對(duì)此并不滿足,打算使用Hibernate的二級(jí)緩存來優(yōu)化訪問文章和欄目時(shí)的速度。
        Hibernate的二級(jí)緩存有很多選擇,我選擇了默認(rèn)的EHCache。它的配置十分簡(jiǎn)單,只要在Hibernate配置里加入

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

然后在Classpath里加入EHCache.xml文件,我的文件內(nèi)容如下:

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

        JavaEye上的《hibernate二級(jí)緩存攻略》對(duì)這些屬性有如下說明:

eternal表示緩存是不是永遠(yuǎn)不超時(shí)

timeToLiveSeconds是緩存中每個(gè)元素(這里也就是一個(gè)POJO)的超時(shí)時(shí)間,如果eternal
= " false " ,超過指定的時(shí)間,這個(gè)元素就被移走了。

timeToIdleSeconds是發(fā)呆時(shí)間,是可選的。當(dāng)往緩存里面put的元素超過500個(gè)時(shí),如果overflowToDisk
= " true " ,就會(huì)把緩存中的部分?jǐn)?shù)據(jù)保存在硬盤上的臨時(shí)文件里面。

注意:我的配置中最大元素設(shè)成了1000。
        如果希望每個(gè)緩存的POJO有自己的配置,可以把defaultCache換成cache name="com.xxx.pojo.Foo"。
        完成了EHCache.xml的配置,接下來在每個(gè)要被緩存的POJO映射 文件里加入

< cache usage = " read-write "   />

其中read-write是緩存策略,Hibernate還有read-only、nonstrict-read-write和transactional這些策略以供選擇。
        配置完成后,我用JMeter測(cè)試,發(fā)現(xiàn)頭兩次訪問的時(shí)間很長(zhǎng),但隨后的訪問速度有很大提升,數(shù)字上相差兩位呢。雖然在實(shí)際使用時(shí)還有網(wǎng)絡(luò)等因素會(huì)影響站點(diǎn)的訪問,不過總的來說對(duì)于這樣的小型文章系統(tǒng),二級(jí)緩存的使用還是對(duì)整體性能有幫助的。最后要做的就是根據(jù)實(shí)際使用情況,適當(dāng)調(diào)整一下緩存設(shè)置,我用SpringAOP建立了一個(gè)處理日志的攔截器,記錄訪問量和訪問間隔,先讓它運(yùn)行一段時(shí)間,隨后根據(jù)日志情況對(duì)緩存作調(diào)整。