http://dev.csdn.net/Develop/article/27/27107.shtm 緩存屬性 我們將所有的緩存參數(shù)配置在名為cache.ccf的屬性文件中。這些參數(shù)包括緩存信息如:內(nèi)存中存儲(chǔ)的對(duì)象的最大數(shù)量,緩存時(shí)間(過了時(shí)間之后緩存的數(shù)據(jù)九自動(dòng)從內(nèi)存中釋放),中斷時(shí)間(elapsed time since last access time), 內(nèi)存緩存名稱(例如:緩存算法如LRU或MRU)等。在當(dāng)前版本的JCS中,緩存屬性文件是純文本格式的。SpiritCache framework,一種來自SpiritSoft的Jcache API商業(yè)實(shí)現(xiàn),支持XML格式的緩存配置。 確認(rèn)該屬性文件存放在類路徑中。注意:如果你需要使用其它不同的文件來存放緩存屬性的話,JCS 也提供了方法來指定一個(gè)配置文件的名稱。請(qǐng)參考JCS的 Javadocs 學(xué)習(xí)如 下面列出來的是web應(yīng)用使用緩存功能需要了解的一些Java類。這些類存放在本文的示例代碼的common.caching包中。這些類的Javadocs也包括在源代碼壓縮包中。 (圖2 中的類圖顯示了這些Java類的關(guān)系) ICacheManager 這是客戶應(yīng)用實(shí)現(xiàn)所有緩存有關(guān)操作(如:存儲(chǔ)、訪問以及釋放緩存中的數(shù)據(jù))的主接口(契約)。客戶程序可以是JSP、Struts Action類,或者就是一個(gè)POJO對(duì)象。創(chuàng)建該接口用于對(duì)客戶端隱藏所有緩存的實(shí)現(xiàn)細(xì)節(jié),這樣當(dāng)我們將來需要切換另一種的第三方緩存API的時(shí)候無需對(duì)客戶端代碼做任 BaseCacheManager 這是web門戶緩存框架的主類。是對(duì)ICacheManager 接口的最基本實(shí)現(xiàn)。創(chuàng)建BaseCacheManager 用于在一個(gè)類中集中所有緩存相關(guān)的方法。它被設(shè)計(jì)為單例模式保證在servlet容器的JVM中有且僅有一個(gè)ICacheManager 的實(shí)例被創(chuàng)建。在多web服務(wù)器/servlet容器實(shí)例共同處理web請(qǐng)求的集群環(huán)境中,每個(gè)JVM將會(huì)創(chuàng)建獨(dú)立的ICacheManager 實(shí)例。如果將來你要轉(zhuǎn)換到不同的緩存API ,這是唯一需要為新的緩存API修改的類。如果你切換到JCache-兼容的緩存實(shí)現(xiàn),對(duì)緩存管理器的修改將會(huì)是很小的。 ICacheLoader 該接口用于在web客戶端實(shí)現(xiàn)真正的數(shù)據(jù)訪問邏輯。所有需要使用緩存機(jī)制的客戶端應(yīng)用必須實(shí)現(xiàn)該接口。它包括僅有的一個(gè)方法叫做loadCacheObject() ,有兩個(gè)輸入?yún)?shù):一個(gè)String參數(shù)制定緩存區(qū)域名稱,一個(gè)對(duì)象參數(shù)制定緩存鍵值。這樣,緩存管理器將知道在緩存的對(duì)象超過指定的“生存時(shí)間”的時(shí)候,使用哪個(gè)客戶端程序(運(yùn)行loadCacheObject 方法)來重載緩存中的對(duì)象 。 ICacheKey ICacheKey 接口創(chuàng)建的目的是為了隱藏特定的創(chuàng)建緩存鍵值的細(xì)節(jié)。有時(shí)候緩存的鍵值不是一個(gè)簡(jiǎn)單的字符串。它可能像多個(gè)對(duì)象組合起來一樣復(fù)雜,從數(shù)據(jù)源獲取這些值需要多個(gè)查找方法而不是單一的方法。在這種情況下, ICacheKey 接口可以被用來定義創(chuàng)建緩存鍵值的所有復(fù)雜的邏輯。這樣,緩存鍵值創(chuàng)建邏輯將會(huì)被定義為獨(dú)立的類。我編寫了一個(gè)簡(jiǎn)單的類TestCacheKey 實(shí)現(xiàn)了該接口并實(shí)現(xiàn)了getCacheKey() 方法來演示使用該接口的方法。 CacheRegions:一個(gè) 緩存區(qū)域 被定義為一個(gè)組織起來的命名空間用于容納一組緩存對(duì)象集合。你需要在配置文件中定義緩存區(qū)域來實(shí)現(xiàn)在一塊單獨(dú)的內(nèi)存空間中存儲(chǔ)數(shù)據(jù),管理緩存數(shù)據(jù)的有效期限。如果需要的話,對(duì)有相似特征的對(duì)象(例如:生存時(shí)間和業(yè)務(wù)用途)應(yīng)該被緩存在相同的緩存區(qū)域中,讓它們可以在相同的時(shí)間失效。我定義了分離的緩存區(qū)域來存儲(chǔ)靜態(tài)數(shù)據(jù)和小變動(dòng)數(shù)據(jù)。為了避免同步操作帶來的效率影響,我對(duì)每個(gè)緩存區(qū)域使用了單獨(dú)的Cache (JCS) 實(shí)例。
該類用于封裝所有的緩存統(tǒng)計(jì)信息(例如:命中數(shù)、不中數(shù)、命中比例等),用來監(jiān)測(cè)在web應(yīng)用中所有緩存對(duì)象的效率。 編譯, 構(gòu)建, 和單元測(cè)試 我用Ant創(chuàng)建了一個(gè)構(gòu)建腳本來編譯我的對(duì)象緩存框架的所有代碼。Ant的構(gòu)建腳本build.xml, 放在WEB-INF\classes 目錄下。我還編寫了Junit測(cè)試客戶端來測(cè)試使用web門戶緩存框架的不同緩存場(chǎng)景。測(cè)試腳本CachingTestCase, 放在WEB-INF\classes\common\caching\test 目錄下。解壓縮示例代碼到一個(gè)新的web應(yīng)用目錄,如果要驗(yàn)證Junit測(cè)試腳本,從命令行運(yùn)行以下命令: 切換當(dāng)前目錄到%TOMCAT_HOME%/webapps/web-app-name/WEB-INF/classes (在Unix測(cè)試環(huán)境中,目錄應(yīng)該是$TOMCAT_HOME/webapps/web-app-name/WEB-INF/classes)。 運(yùn)行以下命令:
考慮 當(dāng)你決定要在你的web應(yīng)用中緩存一些特定類別的數(shù)據(jù)的時(shí)候,請(qǐng)參照這些指導(dǎo)方針。緩存的應(yīng)用應(yīng)該經(jīng)過謹(jǐn)慎地考慮,只有當(dāng)其它方法,如:數(shù)據(jù)訪問等,已經(jīng)無法再進(jìn)一步改進(jìn)的時(shí)候才需要使用緩存。緩存將會(huì)帶來復(fù)雜性,讓維護(hù)工作變得更加復(fù)雜。因此,必須統(tǒng)籌考慮性能和緩存帶來的復(fù)雜性的平衡關(guān)系。 當(dāng)考慮使用緩存的時(shí)候,需要考慮對(duì)象的預(yù)定執(zhí)行時(shí)間和刷新率或者叫做對(duì)象的生存時(shí)間。緩存不能容納所有我們想要存儲(chǔ)的數(shù)據(jù),因此緩存使用的內(nèi)存及時(shí)得到釋放,即可以通過定義合理的生存時(shí)間實(shí)現(xiàn),也可以在數(shù)據(jù)不再需要的時(shí)候顯式地釋放被緩存的對(duì)象。可以指定緩存算法如最近被訪問算法(LRU)或者最少被使用算法(LFU)以便緩存基于訪問頻率來釋放對(duì)象。Jack Shirazi的著作 Java 性能調(diào)整 提供了一個(gè)關(guān)于緩存主題的非常有趣的討論,討論了什么類型的數(shù)據(jù)應(yīng)該被緩存,以及 注意緩存框架并沒有處理在web應(yīng)用中需要被緩存的對(duì)象的創(chuàng)建(例如:從數(shù)據(jù)源檢索數(shù)據(jù)的數(shù)據(jù)訪問邏輯并沒有在緩存類中編寫)。這要依賴于客戶程序來定義真正的數(shù)據(jù)訪問邏輯。像Java數(shù)據(jù)對(duì)象等技術(shù)通常用于在企業(yè)級(jí)web應(yīng)用中封裝數(shù)據(jù)訪問邏輯。參考O'Reilly的 Java 數(shù)據(jù)對(duì)象 來學(xué)習(xí)更多的關(guān)于如 結(jié)論 本文提供了對(duì)使用Jakarta的Java緩存系統(tǒng)(JCS)來為web門戶應(yīng)用開發(fā)對(duì)象緩存框架的概要介紹。該框架非常穩(wěn)定并可以被重用于其它任 JCS was built as a system close to JCACHE Java Temporary Caching API (JSR-107), a description of the caching system used in Oracle 9i and other popular caching frameworks. 該規(guī)范可能會(huì)在將來的JDK發(fā)行版本中作為一種Java擴(kuò)展框架。我的其中一個(gè)目的就是讓web門戶緩存框架與JCS保持松散耦合。這樣的話,如果我將來需要轉(zhuǎn)換到另一種框架(例如Jcache),我可以在對(duì)web門戶應(yīng)用客戶程序代碼不做大的調(diào)整的情況下完成切換。 我現(xiàn)在通過記錄緩存監(jiān)測(cè)信息的日志(使用Log4J API)如:命中數(shù)、不中數(shù)、命中率來衡量緩存的效率。可能將來有其它參數(shù)需要被監(jiān)測(cè)來衡量緩存的效率。同樣的,用來測(cè)量使用或不使用緩存對(duì)數(shù)據(jù)訪問的反饋時(shí)間,應(yīng)該使用一些負(fù)載測(cè)試工具如:Grinder或者Jmeter來測(cè)試其伸縮性和性能效果。 在機(jī)群環(huán)境下保持緩存同步將是一個(gè)挑戰(zhàn),因?yàn)槊總€(gè)servlet容器將會(huì)在自己的JVM中擁有一個(gè)緩存管理器實(shí)例。解決該問題的方法就是創(chuàng)建消息驅(qū)動(dòng)Bean(MDB)在需要刷新數(shù)據(jù)的時(shí)候通知所有的緩存管理器。 通常的對(duì)象查找方法,如:簡(jiǎn)單的Hashtable、JNDI甚至是EJB,提供了在內(nèi)存中存放對(duì)象并通過鍵值查找對(duì)象的方法。但是任 雖然將緩存功能集成到web應(yīng)用中需要額外的設(shè)計(jì)和開發(fā)工作,但我認(rèn)為緩存帶來的利益大于額外付出的工作。我已經(jīng)看到在我實(shí)現(xiàn)了緩存框架之后 ,我的web應(yīng)用的性能有很大的提高,特別是在訪問靜態(tài)數(shù)據(jù)和查找結(jié)果方面。該web應(yīng)用模塊目前處于測(cè)試階段。在不久的將來,我會(huì)提供一些性能方面的測(cè)試數(shù)據(jù)(包括使用與不使用緩存的情況)來比較緩存如 示例代碼 參考資源
Srini Penchikala 是一名軟件咨詢顧問,當(dāng)前為Computer Consultants of America, Inc. 工作。 |
只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關(guān)文章:
|
||