版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、javaweb應(yīng)用緩存技術(shù)資料收集與總結(jié) 作者:夏俊 時(shí)間:2011-1-2web用戶行為分析系統(tǒng)上線,在測(cè)試某些功能時(shí)候,發(fā)現(xiàn)部分功能響應(yīng)時(shí)間過(guò)長(zhǎng),比如對(duì)起點(diǎn)文學(xué)的按月的統(tǒng)計(jì)數(shù)據(jù)顯示,響應(yīng)時(shí)間超過(guò)了3秒,這個(gè)不太符合用戶的需要,那么接下來(lái)就是優(yōu)化系統(tǒng),提高系統(tǒng)速度的工作。我們?cè)诜治鲰憫?yīng)速度緩慢的原因,發(fā)現(xiàn)還是數(shù)據(jù)庫(kù)處理數(shù)據(jù)這塊原因,究其根本還是數(shù)據(jù)量過(guò)大的原因,而且在數(shù)據(jù)庫(kù)層面已經(jīng)速度這塊很難再有提升,因此考慮到web的緩存技術(shù),這些響應(yīng)速度緩慢的功能基本都是按周,按月的統(tǒng)計(jì)數(shù)據(jù),因此在單位時(shí)間內(nèi)的緩存是完全可以實(shí)現(xiàn),以下就是我收集的java web緩存的相關(guān)技術(shù),有兩個(gè)技術(shù)重點(diǎn)推薦,一個(gè)是
2、oscache,一個(gè)是jcs,這兩個(gè)是緩存技術(shù)里應(yīng)用最為廣泛的,也是最為成熟并且是開(kāi)源的技術(shù)。下面是我推薦這兩種技術(shù)的原因,如下:1) 都是開(kāi)源的java程序2) 網(wǎng)上能找到比較豐富的資料3) 都支持分布式的系統(tǒng)4) 操作部署都不太難5) 均符合我們現(xiàn)在系統(tǒng)開(kāi)發(fā)的需要oscache和jcs區(qū)別在哪里了?現(xiàn)在我都只是簡(jiǎn)單看了下,現(xiàn)在總結(jié)還不全面,等具體操作后會(huì)加以補(bǔ)充:1) oscache我找到的資料,我感覺(jué)主要是是頁(yè)面級(jí)的緩存,他的緩存開(kāi)發(fā)代碼基本都是在頁(yè)面里,用標(biāo)簽定義,應(yīng)該數(shù)據(jù)都是緩存在客戶端(這點(diǎn)還要細(xì)細(xì)體味)2) jcs是服務(wù)端的緩存,他基本是將需要緩存的數(shù)據(jù)先存在服務(wù)器的內(nèi)存或是硬盤(pán)
3、里,在一定時(shí)間內(nèi)用戶可以不通過(guò)數(shù)據(jù)庫(kù)這個(gè)線路獲取數(shù)據(jù),而是從服務(wù)器直接獲取,但這樣會(huì)不會(huì)服務(wù)端負(fù)荷過(guò)大從以上區(qū)別來(lái)說(shuō),如果數(shù)據(jù)能在客戶端緩存,我還是更加推薦點(diǎn),但是客戶端如果緩存,用戶要是有什么原因經(jīng)常清理客戶端緩存也是個(gè)問(wèn)題。最后這幾種緩存技術(shù)和我們現(xiàn)在系統(tǒng)的整合的問(wèn)題,這個(gè)我還要接著找下數(shù)據(jù),我們系統(tǒng)是struts2+jquery(service和dao層,這個(gè)緩存應(yīng)該不會(huì)牽涉到),jcs是服務(wù)端緩存,所以數(shù)據(jù)返回可以在action里封裝,對(duì)于前臺(tái)而言影響不大,至于oscache,如果使用它那么系統(tǒng)該如何改造,這個(gè)我要考慮下。再有就是何時(shí)來(lái)緩存數(shù)據(jù),就是觸發(fā)緩存的方式,是用戶的第一次在適當(dāng)
4、時(shí)間的點(diǎn)擊還是通過(guò)調(diào)度的方式定時(shí)緩存了,這點(diǎn)也要考慮下。寫(xiě)以上內(nèi)容發(fā)現(xiàn)自己剛才對(duì)oscache沒(méi)有理解太清楚,oscache緩存是使用標(biāo)簽的,在標(biāo)簽里的內(nèi)容就會(huì)按時(shí)間緩存。因此實(shí)際操作下是很重要的。(一) 第一份資料jcsjava 緩存系統(tǒng)(java caching system,jcs)a) 資料編號(hào)no101jcs概述:jcs 是一個(gè)用 java 語(yǔ)言編寫(xiě)的緩存系統(tǒng),可以使用它來(lái)創(chuàng)建 java 桌面和 web 應(yīng)用程序。它提供了在緩存器中存儲(chǔ)數(shù)據(jù)、從緩存器中刪除數(shù)據(jù)等方便機(jī)制。使用 jcs 可以在各種指定的數(shù)據(jù)區(qū)域 中存儲(chǔ)緩存數(shù)據(jù)。jcs 定義了 4 種類型的核心區(qū)域:內(nèi)存區(qū)域、磁盤(pán)區(qū)域、
5、外圍區(qū)域和遠(yuǎn)程區(qū)域??梢越Y(jié)合使用這些核心區(qū)域以在如何存儲(chǔ)緩存數(shù)據(jù)、將緩存數(shù)據(jù)存儲(chǔ)在什么地方等方面獲得更大的靈活性。您可以指定首次使用哪個(gè)區(qū)域,以及發(fā)生故障時(shí)轉(zhuǎn)移到哪個(gè)區(qū)域。內(nèi)存區(qū)域:內(nèi)存區(qū)域是一個(gè)使用最近最少算法(least recently used,lru)的純內(nèi)存緩存區(qū)域。當(dāng)內(nèi)存緩存區(qū)域滿時(shí),lru 會(huì)首先刪除最近最少使用的緩存數(shù)據(jù)。這個(gè)數(shù)據(jù)區(qū)域執(zhí)行良好,大多數(shù) jcs 用戶將它指定為最先使用的默認(rèn)緩存區(qū)域。磁盤(pán)區(qū)域:磁盤(pán)區(qū)域是在 web 服務(wù)器的文件磁盤(pán)上緩存數(shù)據(jù)。為了提高性能,jcs 在文件磁盤(pán)上存儲(chǔ)實(shí)際緩存數(shù)據(jù)的同時(shí),會(huì)在內(nèi)存中存儲(chǔ)緩存數(shù)據(jù)鍵。在首先使用內(nèi)存區(qū)域的典型 jcs 配置
6、中,任何無(wú)法在內(nèi)存區(qū)域中保存的數(shù)據(jù)都會(huì)寫(xiě)入磁盤(pán)區(qū)域中。外圍區(qū)域:外圍區(qū)域提供一種可配置方式來(lái)在多臺(tái)服務(wù)器之間分發(fā)緩存數(shù)據(jù)。緩存數(shù)據(jù)服務(wù)器必須有一個(gè)開(kāi)放的用于偵聽(tīng)的端口,而且必須創(chuàng)建一個(gè)套接字連接。這個(gè)區(qū)域存在一個(gè)潛在問(wèn)題,因?yàn)樗荒鼙WC各緩存之間的數(shù)據(jù)的一致性。但如果是按計(jì)劃使用該區(qū)域,則不會(huì)出現(xiàn)這個(gè)問(wèn)題。遠(yuǎn)程區(qū)域:遠(yuǎn)程區(qū)域提供了一個(gè)使用遠(yuǎn)程方法調(diào)用(rmi)api 的緩存區(qū)域。這個(gè)區(qū)域使用一臺(tái)遠(yuǎn)程服務(wù)器處理緩存數(shù)據(jù)。這臺(tái)遠(yuǎn)程緩存服務(wù)器可以被多個(gè) jcs 客戶端應(yīng)用程序用于存儲(chǔ)緩存數(shù)據(jù)。一些偵聽(tīng)器被定義用于收集來(lái)自客戶端和服務(wù)器的請(qǐng)求。這個(gè)緩存區(qū)域幫助減少串行化和多個(gè)連接點(diǎn)的開(kāi)銷(xiāo)。(jcs 的
7、可插入控制器:jcs 通過(guò)組合緩存器(composite cache)讓使用多個(gè)區(qū)域進(jìn)行緩存存儲(chǔ)變得很簡(jiǎn)單。組合緩存器為緩存區(qū)域提供了一個(gè)可插入控制器。組合緩存器仔細(xì)處理復(fù)雜的任務(wù),即確定何時(shí)以及如何使用每個(gè)緩存區(qū)域。jcs 將完成大部分復(fù)雜的工作,開(kāi)發(fā)人員只需關(guān)心獲取和設(shè)置緩存。)夏俊備注:我看了下ibatis緩存機(jī)制,內(nèi)存區(qū)域的緩存和磁盤(pán)緩存,ibatis也有實(shí)現(xiàn)。jcs 配置:配置 jcs 就是簡(jiǎn)單地創(chuàng)建和填充一個(gè) cache.ccf 文件。這個(gè)文件定義緩存應(yīng)該使用哪些區(qū)域,以及這些區(qū)域的屬性或選項(xiàng)。根據(jù)應(yīng)用程序的需求配置這個(gè)文件是一種快速擴(kuò)展緩存的簡(jiǎn)便方式。您可以指定許多適合配置的選項(xiàng)
8、和屬性來(lái)滿足需求。清單 1 顯示的是最基本的 cache.ccf 文件 一個(gè)純內(nèi)存緩存配置:清單 1. jcs 的基本配置jcs.default=jcs.default.cacheattributes=org.apache.jcs.engine.compositecacheattributesjcs.default.cacheattributes.maxobjects=1000jcs.default.cacheattributes.memorycachename=org.apache.jcs.engine.memory.lru.lrumemorycache從清單 1 中可以看出,該配置文件將內(nèi)
9、存緩存指定為一個(gè) lrumemorycache。還可以看到,內(nèi)存中能保存的對(duì)象的最大數(shù)量被設(shè)置為 1000。大多數(shù)應(yīng)用程序的緩存系統(tǒng)配置要比清單 1 中復(fù)雜得多。在清單 2 的配置中,我在定義自己的區(qū)域(our_region)時(shí)使用了一個(gè)內(nèi)存區(qū)域和一個(gè)磁盤(pán)區(qū)域:清單 2. 在 jcs 配置中定義的區(qū)域jcs.default=disk_regionjcs.default.cacheattributes=org.apache.jcs.engine.compositecacheattributesjcs.default.cacheattributes.maxobjects=1000jcs.defau
10、lt.cacheattributes.memorycachename=org.apache.jcs.engine.memory.lru.lrumemorycachejcs.region.our_region=disk_regionjcs.region.our_region.cacheattributes=org.apache.jcs.engine.compositecacheattributesjcs.region.our_region.cacheattributes.maxobjects=1000jcs.region.our_region.cacheattributes.memorycach
11、ename= org.apache.jcs.engine.memory.lru.lrumemorycachejcs.region.our_region.cacheattributes.usememoryshrinker=truejcs.region.our_region.cacheattributes.maxmemoryidletimeseconds=3600jcs.region.our_region.cacheattributes.shrinkerintervalseconds=60jcs.region.our_region.cacheattributes.maxspoolperrun=50
12、0jcs.region.our_region.elementattributes=org.apache.jcs.engine.elementattributesjcs.region.our_region.elementattributes.iseternal=falsejcs.auxiliary.disk_region=org.apache.jcs.auxiliary.disk.indexed.indexeddiskcachefactoryjcs.auxiliary.disk_region.attributes= org.apache.jcs.auxiliary.disk.indexed.in
13、dexeddiskcacheattributesjcs.auxiliary.disk_region.attributes.diskpath=c:/jcs/disk_regionjcs.auxiliary.disk_region.attributes.maxkeysize=100000清單 2 中的第一行表明該配置將默認(rèn)區(qū)域設(shè)置為 disk_region。disk_region 是 indexeddiskcachefactory 類型,并且該文件在磁盤(pán)上指定為 c:jcsdisk_region。清單 2 中的第二個(gè)配置組定義了我自己的區(qū)域,我為它添加了一些選項(xiàng),這種類型的配置(在指定用戶定義區(qū)域
14、時(shí)同時(shí)使用內(nèi)存區(qū)域和磁盤(pán)區(qū)域)是很常見(jiàn)的。清單 2 中的第 3 個(gè)配置組定義了一個(gè) 輔助區(qū)域。jcs 有兩個(gè)依賴項(xiàng):concurrent 和 commons-logging(jcs 之前的版本中,還有兩個(gè)其他依賴項(xiàng):commons-collections 和 commons-lang)。(jcs 輔助插件:除了 4 個(gè)核心緩存實(shí)現(xiàn)外,jcs 還提供了一些輔助插件,它們是區(qū)域可以使用的可選插件。這些輔助插件包括索引磁盤(pán)緩存(indexed disk cache)、tcp 外圍緩存(tcp lateral cache)和遠(yuǎn)程緩存服務(wù)器(remote cache server)。例如
15、,索引磁盤(pán)緩存允許在到達(dá)內(nèi)存閾值時(shí)在磁盤(pán)上交換項(xiàng)目。這使得每個(gè)區(qū)域能更靈活地控制其緩存,提供一種類似于大多數(shù)操作系統(tǒng)所使用的虛擬內(nèi)存的存儲(chǔ)方法。cache.ccf 配置文件可以讓每個(gè)輔助區(qū)域滿足應(yīng)用程序的需求。 )jcs 的基本用法:學(xué)習(xí) jcs 基礎(chǔ)知識(shí)的一個(gè)好方法是查看 api 最常用的方法。最好從初始化區(qū)域開(kāi)始。初始化 jcs 緩存區(qū)域?qū)ο竽苁鼓L問(wèn)大部分所需的常用方法。清單 3 初始化 jcs 對(duì)象并獲得一個(gè)默認(rèn)緩存區(qū)域?qū)嵗呵鍐?3. 檢索默認(rèn)緩存區(qū)域/ initialize the jcs object and get an instance of the default cach
16、e regionjcs cache = jcs.getinstance(default);檢索 jcs 實(shí)例后,可以調(diào)用最需要的方法。put 方法將一個(gè)新對(duì)象放入緩存中。接下來(lái)只需一個(gè) key(第一個(gè)參數(shù))和一個(gè) value(第二個(gè)參數(shù))。清單 4 顯示一個(gè)基本示例:清單 4. 設(shè)置緩存項(xiàng)/ set upstring key = key0;string value = value0;/ place a new object in the cachecache.put(key, value);清單 4 中的示例使用字符串值作為參數(shù),但是您可以使用任何對(duì)象。檢索緩存對(duì)象只不過(guò)是使用 jcs 提供的
17、 get 方法。清單 5 顯示了一個(gè)簡(jiǎn)單示例。同樣,本例使用了一個(gè)字符串參數(shù),但您可以使用任何對(duì)象。清單 5. 檢索緩存項(xiàng)/ retrieve a cached objectstring cacheddata = (string)cache.get(key);測(cè)試緩存數(shù)據(jù)的有效性可能是處理緩存系統(tǒng)時(shí)需要使用的另一種方法。在 jcs 中,沒(méi)有定義只測(cè)試緩存項(xiàng)是否存在的測(cè)試緩存方法。但是 get 方法的返回值可以幫助您。清單 6 顯示了一種獲得此必要功能的方式:清單 6. 測(cè)試緩存項(xiàng)的有效性/ retrieve a cached objectstring cacheddata = (string)
18、cache.get(key);/ check if the retrieval workedif (cacheddata != null) / the cacheddata is valid and can be used system.out.println(valid cached data: + cacheddata);最后需要幾個(gè)用于在使用 jcs、緩存項(xiàng)和緩存區(qū)域后清除它們的常用緩存實(shí)用程序。jcs 提供了一種 clear 方法,用于從調(diào)用的緩存區(qū)域中刪除所有緩存數(shù)據(jù)。此外,還提供了一個(gè) remove 方法,用于刪除指定緩存項(xiàng)。dispose 方法也可以處理初始化的 jcs 區(qū)域。清
19、單 7 顯示了如何使用這些方法:清單 7. 清除緩存區(qū)域/ dispose of a specific cached itemcache.remove(key);/ dispose of all cache datacache.clear();/ dispose of the cache regioncache.dispose();jcs 和 java 對(duì)象:jcs 優(yōu)于其他緩存系統(tǒng)(請(qǐng)參閱 參考資料)的一個(gè)地方是它可以很好地使用對(duì)象。大多數(shù) web 應(yīng)用程序是使用面向?qū)ο蟮姆椒ㄍㄟ^(guò) java 技術(shù)創(chuàng)建的。例如,與連續(xù)從數(shù)據(jù)庫(kù)中逐段檢索對(duì)象相比,緩存對(duì)象使應(yīng)用程序能夠更好地執(zhí)行。 設(shè)計(jì)一個(gè)簡(jiǎn)單
20、的面向?qū)ο蟮?jcs 站點(diǎn)的第一個(gè)步驟是創(chuàng)建需要存儲(chǔ)的對(duì)象。在本例中,我將開(kāi)發(fā)一個(gè)基本 blogging 站點(diǎn)。清單 8 顯示了我將使用的 blogobject 類:清單 8. blogobject 類package com.ibm.developerworks.objects;import java.io.serializable;import java.util.date;public class blogobject implements serializable private static final long serialversionuid = 63923761461635100
21、46l; private int blogid; private string author; private date date; private string title; private string content; public blogobject(int blogid, string author, date date, string title, string content) this.blogid = blogid; this.author = author; this.date = date; this.title = title; this.content = cont
22、ent; public int getblogid() return this.blogid; public string getauthor() return this.author; public date getdate() return this.date; public string gettitle() return this.title; public string getcontent() return this.content; 在一個(gè)類中表示對(duì)象后,接著還需要一個(gè)類來(lái)管理該對(duì)象。管理器處理所有與 blog 對(duì)象相關(guān)的管理和緩存功能。在本例中,管理器將處理三大任務(wù): 檢索 b
23、log 對(duì)象 在緩存中設(shè)置 blog 對(duì)象 從緩存中清除 blog 對(duì)象 如清單 9 所示,getblog 方法檢索 blog 對(duì)象。該方法首先試圖從緩存獲得 blog 對(duì)象。如果該對(duì)象不在緩存中,它將根據(jù)其他機(jī)制獲取該對(duì)象:清單 9. 通過(guò) blog 管理器檢索 blog 對(duì)象public blogobject getblog(int id) blogobject blog = null; try blogcache = jcs.getinstance(blogcacheregion); blog = (blogobject)blogcache.get(id); catch (cacheex
24、ception ce) blog = null; if (blog = null) blog = databasemanager.getblog(id); this.setblog( blog.getblogid(), blog.getauthor(), blog.getdate(), blog.gettitle(), blog.getcontent() ); return blog;在清單 9 中,我使用一個(gè)數(shù)據(jù)庫(kù)作為檢索 blog 對(duì)象的替代機(jī)制。根據(jù)另一種機(jī)制檢索該對(duì)象時(shí),應(yīng)該將該對(duì)象設(shè)置為緩存,以便下一次檢索可以直接從該緩存獲取這個(gè)對(duì)象。如清單 10 所示,setblog 方法將 bl
25、og 對(duì)象放在緩存中。這個(gè)方法比較簡(jiǎn)單,因?yàn)樗皇鞘褂脗魅氲男畔?chuàng)建一個(gè)新的 blog 對(duì)象,然后將這個(gè)對(duì)象放在緩存中。清單 10. 通過(guò) blog 管理器將 blog 對(duì)象放在緩存中public boolean setblog(int bid, string author, date date, string title, string content) blogobject blog = new blogobject(bid, author, date, title, content); try blogcache = jcs.getinstance(blogcacheregion); b
26、logcache.put(bid, blog); return true; catch (cacheexception ce) return false; 如清單 11 所示,cleanblog 方法要么從緩存中清除一個(gè)指定的 blog,要么從緩存中清除掉所有 blog。這個(gè)方法使用 jcs 的 remove 和 clear 方法來(lái)清除緩存對(duì)象。清單 11. 通過(guò) blog 管理器從緩存中刪除 blog 對(duì)象public boolean cleanblog(int blogid) try blogcache = jcs.getinstance(blogcacheregion); blogcac
27、he.remove(blogid); catch (cacheexception ce) return false; return true;public boolean cleanblog() try blogcache = jcs.getinstance(blogcacheregion); blogcache.clear(); catch (cacheexception ce) return false; return true;前面的幾個(gè)類展示了使用 jcs 緩存對(duì)象是很簡(jiǎn)單的。擁有對(duì)象管理器并使用簡(jiǎn)單的對(duì)象表示之后,您就獲得一種在 web 應(yīng)用程序中處理對(duì)象的簡(jiǎn)單但強(qiáng)大的方法。緩存元數(shù)
28、據(jù)jcs 提供了更多方法,向應(yīng)用程序添加緩存所用的方法只是其中的一小部分。例如,它提供了收集緩存對(duì)象和緩存區(qū)域元數(shù)據(jù)的實(shí)用程序。您可以輕松檢索以下內(nèi)容: 緩存鍵名稱 創(chuàng)建緩存項(xiàng)的時(shí)間 緩存可以存在的最長(zhǎng)時(shí)間 緩存過(guò)期時(shí)間 清單 12 中的例子顯示如何檢索緩存項(xiàng)的元數(shù)據(jù):清單 12. 檢索緩存項(xiàng)的元數(shù)據(jù)try jcsadminbean admin = new jcsadminbean(); linkedlist linkedlist = admin.buildelementinfo(regionname); listiterator iterator = linkedlist.listitera
29、tor(); while (iterator.hasnext() cacheelementinfo info = (cacheelementinfo)iterator.next(); system.out.println(key: + info.getkey(); system.out.println(creation time: + info.getcreatetime(); system.out.println(maximum life (seconds): + info.getmaxlifeseconds(); system.out.println(expires in (seconds
30、): + info.getexpiresinseconds(); catch (exception e) 清單 13. 檢索緩存區(qū)域的元數(shù)據(jù)try jcsadminbean admin = new jcsadminbean(); linkedlist linkedlist = admin.buildcacheinfo(); listiterator iterator = linkedlist.listiterator(); while (iterator.hasnext() cacheregioninfo info = (cacheregioninfo)iterator.next(); com
31、positecache compcache = info.getcache(); system.out.println(cache name: + compcache.getcachename(); system.out.println(cache type: + compcache.getcachetype(); system.out.println(cache misses (not found): + compcache.getmisscountnotfound(); system.out.println(cache misses (expired): + compcache.getmi
32、sscountexpired(); system.out.println(cache hits (memory): + compcache.gethitcountram(); system.out.println(cache updates: + compcache.getupdatecount(); catch (exception e) 收集緩存區(qū)域和項(xiàng)的元數(shù)據(jù)能幫助您分析 web 站點(diǎn)的哪些區(qū)域和項(xiàng)目需要優(yōu)化。元數(shù)據(jù)也能幫助您管理時(shí)間敏感型的緩存數(shù)據(jù)。例如,您可以使用每個(gè)緩存項(xiàng)的最長(zhǎng)生命周期和過(guò)期時(shí)間來(lái)為需要更新數(shù)據(jù)的特定用戶刷新緩存數(shù)據(jù)。結(jié)束語(yǔ):jcs 是為 java 開(kāi)發(fā)人員提供的功
33、能強(qiáng)大但簡(jiǎn)單易用的緩存系統(tǒng)。它為桌面和類似的 web 應(yīng)用程序提供數(shù)據(jù)緩存。類似桌面的 web 應(yīng)用程序的發(fā)展前景是提高速度和敏捷性。緩存數(shù)據(jù)對(duì)這些方面非常有益。本文概述如何配置和使用 jcs。此外,還討論了基本緩存方法所需要語(yǔ)法,以及如何在常見(jiàn) web 應(yīng)用程序中緩存對(duì)象和檢索緩存元數(shù)據(jù)。解了 jcs 的基本知識(shí)之后,您現(xiàn)在可以利用數(shù)據(jù)緩存功能來(lái)開(kāi)發(fā)下一個(gè) web 站點(diǎn)了。您還可以學(xué)習(xí)其他幾個(gè)提供高級(jí)功能的 jcs 區(qū)域,比如 http servlet 訪問(wèn)、jcs 實(shí)用程序、基本 http 驗(yàn)證和其他輔助區(qū)域。b) 資料編號(hào)no102給web應(yīng)用加jcs緩存系統(tǒng): 下載jcs-1.2.6.
34、jar,找了半天也沒(méi)有找到它的源碼和api文檔,不知為什么?在這個(gè)站點(diǎn)有: using jcs: some basics for the web ,不錯(cuò),就用它練習(xí)。一、創(chuàng)建值對(duì)象假設(shè)有一book,它在數(shù)據(jù)庫(kù)中的表為:table book(book_id_pk ,title ,author,isbn,price,publish_date)創(chuàng)建值對(duì)象如下:package com.genericbookstore.data;import java.io.serializable;import java.util.date;public class bookvobj implements seria
35、lizable public int bookid = 0; public string title; public string author; public string isbn; . public string price; public date publishdate; public bookvobj() 二、創(chuàng)建緩存管理器應(yīng)用中對(duì)book數(shù)據(jù)的訪問(wèn)都通過(guò)緩存管理器。package com.genericbookstore.data;import org.apache.jcs.jcs;/ in case we want to set some special behaviorimp
36、ort org.apache.jcs.engine.behavior.ielementattributes;public class bookvobjmanager private static bookvobjmanager instance; private static int checkedout = 0; public static jcs bookcache; private bookvobjmanager()/構(gòu)造函數(shù) try bookcache = jcs.getinstance(bookcache); catch (exception e) / handle cache re
37、gion initialization failure / do other initialization that may be necessary, such as getting / references to any data access classes we may need to populate / value objects later /* * singleton access point to the manager. */ public static bookvobjmanager getinstance() synchronized (bookvobjmanager.
38、class) if (instance = null) instance = new bookvobjmanager(); synchronized (instance) instance.checkedout+; return instance; /* * retrieves a bookvobj.default to look in the cache. */ public bookvobj getbookvobj(int id) return getbookvobj(id, true); /* * retrieves a bookvobj. second argument decides
39、 whether to look * in the cache. returns a new value object if one cant be . * loaded from the database. database cache synchronization is * handled by removing cache elements upon modification. */ public bookvobj getbookvobj(int id, boolean fromcache) bookvobj vobj = null; / first, if requested, at
40、tempt to load from cache if (fromcache) vobj = (bookvobj) bookcache.get(bookvobj + id); / either fromcache was false or the object was not found, so / call loadbookvobj to create it if (vobj = null) . vobj = loadbookvobj(id); returnvobj; /* * creates a bookvobj based on the id of the book table.data
41、 * access could be direct jdbc, some or mapping tool, or an ejb. */ public bookvobj loadbookvobj(int id) bookvobj vobj = new bookvobj(); vobj.bookid = id; try boolean found = false; / load the data and set the rest of the fields / set found to true if it was foundfound = true; / cache the value obje
42、ct if found if (found) / could use the defaults like this / bookcache.put( bookvobj + id, vobj ); / or specify special characteristics / put to cache bookcache.put(bookvobj + id, vobj); catch (exception e) 。 / handle failure putting object to cache return vobj; /* * stores bookvobjs in database.clea
43、rs old items and caches * new. */ public void storebookvobj(bookvobj vobj) try / since any cached data is no longer valid, we should / remove the item from the cache if it an update. if (vobj.bookid != 0) bookcache.remove(bookvobj + vobj.bookid); / put the new object in the cache bookcache.put(bookv
44、obj + vobj.bookid, vobj); catch (exception e) / handle failure removing object or putting object to cache. 三、配置文件cache.ccf,它定義你配置何種類型的緩存、緩存的大小、過(guò)期時(shí)間等。#web-inf/classes/cache.ccf(以下內(nèi)容不要換行)jcs.default=jcs.default.cacheattributes=org.apache.jcs.engine.compositecacheattributesjcs.default.cacheattributes.m
45、axobjects=1000jcs.default.cacheattributes.memorycachename=org.apache.jcs.engine.memory.lru.lrumemorycache jcs.default.cacheattributes.usememoryshrinker=truejcs.default.cacheattributes.maxmemoryidletimeseconds=3600jcs.default.cacheattributes.shrinkerintervalseconds=60jcs.default.cacheattributes.maxsp
46、oolperrun=500jcs.default.elementattributes=org.apache.jcs.engine.elementattributesjcs.default.elementattributes.iseternal=false四、測(cè)試的jsp文件 五、測(cè)試::8080/jcs/testjcs.jspc) 資料編號(hào)no103安裝和配置:在web應(yīng)用中安裝和配置jcs是非常簡(jiǎn)單的事情。從jakarta turbine網(wǎng)站下載壓縮文件,解壓縮文件到臨時(shí)目錄,并拷貝jsc.jar文件(jcs-1.0-dev.jar)到servlet容器的通用目
47、錄(在我的web應(yīng)用中使用的servlet容器是tomcat,通用目錄在windows下就是%tomcat_home%commonlib,在再u(mài)nix類型的系統(tǒng)下就是$tomcat_home/common/lib)。你可能還需要commons-collections.jar, commons-lang.jar, 和 commons-logging.jar 這些文件存在于web應(yīng)用的類路徑下以便使用jcs。框架的主要原理緩存屬性我們將所有的緩存參數(shù)配置在名為cache.ccf的屬性文件中。這些參數(shù)包括緩存信息如:內(nèi)存中存儲(chǔ)的對(duì)象的最大數(shù)量,緩存時(shí)間(過(guò)了時(shí)間之后緩存的數(shù)據(jù)九自動(dòng)從內(nèi)存中釋放),中
48、斷時(shí)間(elapsed time since last access time), 內(nèi)存緩存名稱(例如:緩存算法如lru或mru)等。在當(dāng)前版本的jcs中,緩存屬性文件是純文本格式的。spiritcache framework,一種來(lái)自spiritsoft的jcache api商業(yè)實(shí)現(xiàn),支持xml格式的緩存配置。確認(rèn)該屬性文件存放在類路徑中。注意:如果你需要使用其它不同的文件來(lái)存放緩存屬性的話,jcs 也提供了方法來(lái)指定一個(gè)配置文件的名稱。請(qǐng)參考jcs的 javadocs 學(xué)習(xí)如何從其它非缺省的屬性文件中讀取緩存配置信息。下面列出來(lái)的是web應(yīng)用使用緩存功能需要了解的一些java類。這些類存放
49、在本文的示例代碼的common.caching包中。這些類的javadocs也包括在源代碼壓縮包中。 (圖2 中的類圖顯示了這些java類的關(guān)系)icachemanager這是客戶應(yīng)用實(shí)現(xiàn)所有緩存有關(guān)操作(如:存儲(chǔ)、訪問(wèn)以及釋放緩存中的數(shù)據(jù))的主接口(契約)??蛻舫绦蚩梢允莏sp、struts action類,或者就是一個(gè)pojo對(duì)象。創(chuàng)建該接口用于對(duì)客戶端隱藏所有緩存的實(shí)現(xiàn)細(xì)節(jié),這樣當(dāng)我們將來(lái)需要切換另一種的第三方緩存api的時(shí)候無(wú)需對(duì)客戶端代碼做任何調(diào)整。basecachemanager這是web門(mén)戶緩存框架的主類。是對(duì)icachemanager 接口的最基本實(shí)現(xiàn)。創(chuàng)建basecachem
50、anager 用于在一個(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í)例。如果將來(lái)你要轉(zhuǎn)換到不同的緩存api ,這是唯一需要為新的緩存api修改的類。如果你切換到j(luò)cache-兼容的緩存實(shí)現(xiàn),對(duì)緩存管理器的修改將會(huì)是很小的。icacheloader該接口用于在web客戶端實(shí)現(xiàn)真正的數(shù)據(jù)訪問(wèn)邏輯。所有需要使用緩存機(jī)制的客戶端應(yīng)用必須實(shí)現(xiàn)該接口。它包括僅有的一個(gè)方法叫做loadcache
51、object() ,有兩個(gè)輸入?yún)?shù):一個(gè)string參數(shù)制定緩存區(qū)域名稱,一個(gè)對(duì)象參數(shù)制定緩存鍵值。這樣,緩存管理器將知道在緩存的對(duì)象超過(guò)指定的“生存時(shí)間”的時(shí)候,使用哪個(gè)客戶端程序(運(yùn)行l(wèi)oadcacheobject 方法)來(lái)重載緩存中的對(duì)象 。icachekeyicachekey 接口創(chuàng)建的目的是為了隱藏特定的創(chuàng)建緩存鍵值的細(xì)節(jié)。有時(shí)候緩存的鍵值不是一個(gè)簡(jiǎn)單的字符串。它可能像多個(gè)對(duì)象組合起來(lái)一樣復(fù)雜,從數(shù)據(jù)源獲取這些值需要多個(gè)查找方法而不是單一的方法。在這種情況下, icachekey 接口可以被用來(lái)定義創(chuàng)建緩存鍵值的所有復(fù)雜的邏輯。這樣,緩存鍵值創(chuàng)建邏輯將會(huì)被定義為獨(dú)立的類。我編寫(xiě)了一個(gè)
52、簡(jiǎn)單的類testcachekey 實(shí)現(xiàn)了該接口并實(shí)現(xiàn)了getcachekey() 方法來(lái)演示使用該接口的方法。cacheregions一個(gè) 緩存區(qū)域 被定義為一個(gè)組織起來(lái)的命名空間用于容納一組緩存對(duì)象集合。你需要在配置文件中定義緩存區(qū)域來(lái)實(shí)現(xiàn)在一塊單獨(dú)的內(nèi)存空間中存儲(chǔ)數(shù)據(jù),管理緩存數(shù)據(jù)的有效期限。如果需要的話,對(duì)有相似特征的對(duì)象(例如:生存時(shí)間和業(yè)務(wù)用途)應(yīng)該被緩存在相同的緩存區(qū)域中,讓它們可以在相同的時(shí)間失效。我定義了分離的緩存區(qū)域來(lái)存儲(chǔ)靜態(tài)數(shù)據(jù)和小變動(dòng)數(shù)據(jù)。為了避免同步操作帶來(lái)的效率影響,我對(duì)每個(gè)緩存區(qū)域使用了單獨(dú)的cache (jcs) 實(shí)例。cacheelementinfo該類用于封裝所有的緩存統(tǒng)計(jì)信息(例如:命中數(shù)、不中數(shù)、命中比例等),用來(lái)監(jiān)測(cè)在web應(yīng)用中所有緩存對(duì)象的效率。編譯, 構(gòu)建, 和單元測(cè)試 我用ant創(chuàng)建了一個(gè)構(gòu)建腳本來(lái)編譯我的對(duì)象緩存框架
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 克朗棋產(chǎn)業(yè)運(yùn)行及前景預(yù)測(cè)報(bào)告
- 太陽(yáng)能集熱器市場(chǎng)發(fā)展預(yù)測(cè)和趨勢(shì)分析
- 辦公機(jī)器和設(shè)備的修理行業(yè)營(yíng)銷(xiāo)策略方案
- 綠色環(huán)保主題會(huì)議服務(wù)策劃方案
- 外科和矯形用骨結(jié)合劑市場(chǎng)發(fā)展預(yù)測(cè)和趨勢(shì)分析
- 新員工入職培訓(xùn)協(xié)議書(shū)
- 房地產(chǎn)全民營(yíng)銷(xiāo)策略方案
- 綠色環(huán)保展會(huì)展臺(tái)服務(wù)及施工方案
- 公共交通重型車(chē)輛環(huán)保標(biāo)準(zhǔn)方案
- 中醫(yī)藥行業(yè)創(chuàng)新培訓(xùn)方案
- 24-計(jì)量所年度工作總結(jié)及工作計(jì)劃
- 2.抗美援朝課件(共25張PPT)
- 陶瓷窯爐與設(shè)計(jì):第一章 隧道窯-工作原理
- 急救小常識(shí)醫(yī)療PPT模板
- 人教版八上名著閱讀《昆蟲(chóng)記》分章練習(xí)(含答案)
- 工程項(xiàng)目管理-英文課件-ProjectProcurement.ppt
- 醫(yī)護(hù)人員服務(wù)禮儀及行為規(guī)范-PPT課件
- 鵪鶉蛋脫殼機(jī)的設(shè)計(jì)
- 鋼管束組合結(jié)構(gòu)體系簡(jiǎn)介ppt課件
- 服裝成品質(zhì)量驗(yàn)收標(biāo)準(zhǔn)
- 中國(guó)國(guó)電集團(tuán)公司設(shè)備檢修管理暫行辦法
評(píng)論
0/150
提交評(píng)論