使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存_第1頁
使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存_第2頁
使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存_第3頁
使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存_第4頁
使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存_第5頁
已閱讀5頁,還剩6頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存⑴使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存在我最近的web門戶應(yīng)用開發(fā)工作中,我們需要在Servlet容器(Tomcat)的內(nèi)存中存儲(chǔ)一些查找數(shù)據(jù)(例如:比率更新數(shù)據(jù)、狀態(tài)和產(chǎn)品列表),這樣我們不需要在每次訪問數(shù)據(jù)的時(shí)候進(jìn)行數(shù)據(jù)庫(kù)查找。同時(shí),我們也需要定期地刷新存儲(chǔ)在內(nèi)存中的數(shù)據(jù)以保證其新鮮和準(zhǔn)確。我們也需要一種機(jī)制在不同的時(shí)間間隔對(duì)存儲(chǔ)在內(nèi)存中的不同類型的數(shù)據(jù)進(jìn)行刷新。例如,比率更新數(shù)據(jù)需要每天刷新一次,而查找類型的數(shù)據(jù)則可以在內(nèi)存中保留很長(zhǎng)一段時(shí)間。對(duì)象緩存是最方便地達(dá)到上述所有目的的完美解決方案。對(duì)象緩存最恰當(dāng)?shù)膶?duì)象緩存的定義可以在ObjectCachingServiceforJava(OCS4J)的功能規(guī)范文檔中找到,它是這樣定義的:服務(wù)器必須將信息和可執(zhí)行對(duì)象分為三種基本類別管理:永遠(yuǎn)不會(huì)改變的對(duì)象,每次請(qǐng)求都會(huì)發(fā)生改變的對(duì)象,以及在兩者之間的對(duì)象。Java對(duì)前兩種對(duì)象的處理提供了很好的支持,但是對(duì)第三種類別的支持非常有限。如果對(duì)象永遠(yuǎn)不改變,我們?cè)诜?wù)器初始化的時(shí)候創(chuàng)建靜態(tài)對(duì)象。如果對(duì)每個(gè)請(qǐng)求對(duì)象都是不同的,我們每次都創(chuàng)建新的對(duì)象。對(duì)于介于兩者之間的對(duì)象或信息,它們的狀態(tài)可能會(huì)發(fā)生變化,但是又需要提供跨越請(qǐng)求、跨越用戶或跨越進(jìn)程的共享,就要采用“對(duì)象緩存服務(wù)”了?;旧?,對(duì)象緩存就是通過在使用對(duì)象后不立即釋放,而是存儲(chǔ)在內(nèi)存中并被后來的客戶端請(qǐng)求重用,避免重新獲得對(duì)象的昂貴成本。當(dāng)數(shù)據(jù)第一次從數(shù)據(jù)源被檢索出來后,在名為cache的內(nèi)存緩沖中臨時(shí)存放。同樣的數(shù)據(jù)再次被訪問的時(shí)候,對(duì)象從緩存中取出來,而不是從數(shù)據(jù)源重新獲取。最后,被緩存的數(shù)據(jù)在不再需要的時(shí)候從內(nèi)存中釋放出來。從Web應(yīng)用的觀點(diǎn)來看,什么時(shí)候指定的對(duì)象可以從內(nèi)存中釋放出來取決于定義一個(gè)對(duì)象變成無效的合理的間隔時(shí)間。緩存的益處對(duì)象緩存最主要的益處就是對(duì)應(yīng)用性能的重大提升。在一個(gè)多層應(yīng)用中,與其他工作比較,數(shù)據(jù)訪問是一種代價(jià)非常高的操作。通過將頻繁被訪問的數(shù)據(jù)Bykeepingthefrequentlyaccesseddataaround并在第一次使用后不釋放,我們可以避免重新獲取與釋放對(duì)象的開銷和時(shí)間。這將會(huì)大規(guī)模提升web應(yīng)用的性能,因?yàn)槲覀儾挥迷诿看潍@取數(shù)據(jù)的時(shí)候訪問數(shù)據(jù)庫(kù)了??缮炜s性是使用對(duì)象緩存帶來的另一個(gè)好處。因?yàn)楸痪彺娴臄?shù)據(jù)可以跨越多個(gè)session和web應(yīng)用訪問,對(duì)象緩存可以成為可伸縮性Web應(yīng)用設(shè)計(jì)的一個(gè)重要部分。采用對(duì)象緩存,就像對(duì)象池一樣,可以幫助避免獲取與釋放對(duì)象的開銷。緩存的不利因素在web應(yīng)用中使用對(duì)象緩存可以帶來很多益處,但是緩存對(duì)象同時(shí)也會(huì)帶來一些不利的因素。?同步復(fù)雜性:復(fù)雜性的增長(zhǎng)依賴于數(shù)據(jù)的種類,因?yàn)樾枰WC被緩存數(shù)據(jù)與數(shù)據(jù)源中原始數(shù)據(jù)的一致性。要不然,被緩存的數(shù)據(jù)就會(huì)與實(shí)際數(shù)據(jù)不一致,將會(huì)導(dǎo)致應(yīng)用中的數(shù)據(jù)錯(cuò)誤。?Durability:當(dāng)服務(wù)器崩潰的時(shí)候,被緩存數(shù)據(jù)的修改回丟失??梢圆捎猛骄彺姹苊庠搯栴}。?內(nèi)存大小:如果有大量沒有用處的數(shù)據(jù)存放在緩存中,并且這些數(shù)據(jù)沒有在正常的時(shí)間間隔內(nèi)被釋放,JVM內(nèi)存大小就會(huì)變得無法接受的龐大。緩存實(shí)例任何不經(jīng)常變化的、需要花費(fèi)很長(zhǎng)時(shí)間從數(shù)據(jù)源獲取的數(shù)據(jù)都是緩存的最佳選擇。這包括了幾乎所有的靜態(tài)數(shù)據(jù)、代碼和描述列表,以及帶有分頁功能的查找結(jié)果(搜索結(jié)果可以從數(shù)據(jù)源一次獲取出來并存放在緩存中,等待用戶在結(jié)果頁面上點(diǎn)擊頁數(shù)鏈接時(shí)顯示)。中間件技術(shù)如EJB和CORBA允許在客戶端與服務(wù)器之間的遠(yuǎn)程對(duì)象傳輸。像這種類型的訪問,也被稱為粗粒度數(shù)據(jù)訪問用于降低昂貴的遠(yuǎn)程方法調(diào)用開銷。如果這些數(shù)據(jù)傳輸對(duì)象(也被稱為值對(duì)象變化不是非常頻繁,它們可以被存儲(chǔ)在緩存中。這樣可以在每次客戶端需要值對(duì)象時(shí)減少servlet容器訪問應(yīng)用服務(wù)器的次數(shù)。那么哪些類型的數(shù)據(jù)不宜被緩存呢?這里是一些不推薦使用緩存的數(shù)據(jù)類別:?可以被網(wǎng)站上其他用戶訪問的安全信息。?用戶描述信息。?私人信息,包括社會(huì)保險(xiǎn)號(hào)碼或信用卡明細(xì)信息。?經(jīng)常變化的,并且不準(zhǔn)確或不及時(shí)會(huì)引發(fā)問題的業(yè)務(wù)信息。不應(yīng)該被其它用戶訪問的特定于Session的數(shù)據(jù)。使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存⑵緩存架構(gòu)有很多種對(duì)象緩存架構(gòu)(包括開放源代碼的和商業(yè)的實(shí)現(xiàn))在servlet容器和應(yīng)用服務(wù)器中提供了分布式緩存。下面列出了一些現(xiàn)在可以使用的緩存框架:開放源代碼項(xiàng)目來自于Jakarta的JavaCachingSystem(JCS)(屬于Turbine項(xiàng)目的一部分)OSCacheCommonsCollections(另一個(gè)Jakarta項(xiàng)目)JCacheAPI(SourceF)商業(yè)項(xiàng)目SpiritCache(來自于SpiritSoft).Coherence(Tangosol)Javlin(eXcelon)ObjectCachingServiceforJava(Oracle)如果你還有興趣了解更多的緩存實(shí)現(xiàn),本文最后的資源一節(jié)提供了所有這些框架的URL。我在最初開始我對(duì)能滿足我們所有的緩存需求的框架進(jìn)行研究的時(shí)候,我先看到了CommonsCollections和JavaCachingSystemAPI。我在最開始評(píng)估的主要標(biāo)準(zhǔn)就是容易使用、容易擴(kuò)展,以及軟件的成本。這兩個(gè)框架都是開放源代碼的,并且都來自于ApacheJakarta項(xiàng)目。CommonsCollectionsCommonsCollectionsAPI以一個(gè)Java類的形式提供了對(duì)象緩存算法,名稱為L(zhǎng)RUMap。如果你對(duì)緩存只有基本的需求,并且不是真正需要很多的擴(kuò)展和緩存配置功能,那么CommonsCollections可能是一個(gè)不壞的選擇,但不是作為一個(gè)企業(yè)級(jí)緩存系統(tǒng)的正確選擇。如果你選擇CommonCollections來實(shí)現(xiàn)對(duì)象緩存,你將會(huì)手工定義/配置所有的緩存參數(shù),如:最大緩存對(duì)象的數(shù)量,一個(gè)緩存對(duì)象的最長(zhǎng)生命周期,刷新緩存或檢查對(duì)象新鮮的中斷時(shí)間等。JavaCachingSystemJavaCachingSystem(JCS),JakartaTurbine項(xiàng)目的一部分,與CommonsCollections相比更有成熟、更具擴(kuò)展性。通過為頻繁訪問的對(duì)象維護(hù)動(dòng)態(tài)對(duì)象池的方法,它提供了提升整個(gè)系統(tǒng)性能的靈活、可配置的解決方案。就像在它的網(wǎng)站上提到的,JCS已經(jīng)超越了簡(jiǎn)單地在內(nèi)存中緩存對(duì)象的范圍。它為一個(gè)企業(yè)級(jí)的緩存系統(tǒng)提供了許多必需的重要功能:?內(nèi)存管理Diskoverflow(和重整)?元素分組?快速嵌套地移除?數(shù)據(jù)期限管理?可擴(kuò)展的框架?完全可配置的運(yùn)行時(shí)參數(shù)?遠(yuǎn)程同步?遠(yuǎn)程存儲(chǔ)恢復(fù)通過HTTP、TCP或者UDP協(xié)議實(shí)現(xiàn)可選的橫向分布元素。JCS提供了無故障點(diǎn)的框架,允許完全的session失敗轉(zhuǎn)移(在集群環(huán)境中),包括支持最多到256個(gè)服務(wù)器的session數(shù)據(jù)分布。它也提供了配置一個(gè)或多個(gè)數(shù)據(jù)存儲(chǔ)選項(xiàng)的靈活性,例如:內(nèi)存緩存、磁盤緩存,或者在遠(yuǎn)程機(jī)器上的緩存。所有這些包括在JCS中的優(yōu)秀功能讓它成為滿足我們的web門戶項(xiàng)目的一個(gè)優(yōu)秀的對(duì)象緩存產(chǎn)品選擇使用JCS構(gòu)造Web門戶緩存框架緩存框架的目標(biāo)在我開始設(shè)計(jì)對(duì)象緩存框架之前,我首先列出了在新的框架中需要達(dá)到的目標(biāo)。以下就是目標(biāo)的列表:?在web門戶應(yīng)用中快速訪問頻繁使用的數(shù)據(jù)。?將緩存中類型類似的對(duì)象進(jìn)行組合。?提供可配置的緩存管理,以便我可以通過描述方式而不是編碼方式修改參數(shù)。?提供可靠的和可擴(kuò)展的框架,以便我將來可以轉(zhuǎn)換到其它第三方的緩存API。?可以生成統(tǒng)計(jì)數(shù)據(jù)來監(jiān)測(cè)緩存的效率,以及使用數(shù)據(jù)緩存后應(yīng)用性能的提升效果。安裝和配置在web應(yīng)用中安裝和配置JCS是非常簡(jiǎn)單的事情。從JakartaTurbine網(wǎng)站下載壓縮文件,解壓縮文件到臨時(shí)目錄,并拷貝JSC.jar文件(jcs1.0dev.jar)到servlet容器的通用目錄(在我的web應(yīng)用中使用的servlet容器是Tomcat,通用目錄在windows下就是%TOMCAT_HOME%\common\lib,在再Unix類型的系統(tǒng)下就是$TOMCAT_HOME/common/lib)。你可能還需要commons-collections.jarcommons-lang.jaj;和commons-logging.jar這些文件存在于web應(yīng)用的類路徑下以便使用JCS。對(duì)象緩存框架的主要原理在圖1和圖2的UML圖中展示出來了WebPortalCachingSequenceDiagram:Client:ICacheMana口日r:Cach日::Client:ICacheMana口日r:Cach日:DataAcc日ssOhiectTOC\o"1-5"\h\z1jgetCacheObject(ObjectcacheKey)■:>1::2:CheckifobjectexistsincacheorexpitedIIJII4:ReturnCache!Object3:[Objectdoesnotexistincache]loadCacheObject(ObjectcacheKfey)I■'I■■<IIII:5:Storecacheobject(put)6:I4:ReturnCache!Object7:[Olijectexistsincache]get(Objectcach^Key)

3:Retrievecacheobject:9:Returncacheobject<

WebPortalCaching-ClassDiagram使用JCS在Web門戶應(yīng)用中實(shí)現(xiàn)對(duì)象緩存(3)框架的主要原理緩存屬性我們將所有的緩存參數(shù)配置在名為cache.ccf的屬性文件中。這些參數(shù)包括緩存信息如:內(nèi)存中存儲(chǔ)的對(duì)象的最大數(shù)量,緩存時(shí)間(過了時(shí)間之后緩存的數(shù)據(jù)九自動(dòng)從內(nèi)存中釋放),中斷時(shí)間(elapsedtimesincelastaccesstime),內(nèi)存緩存名稱(例如:緩存算法如LRU或MRU)等。在當(dāng)前版本的JCS中,緩存屬性文件是純文本格式的。SpiritCacheframework,一種來自SpiritSoft的JcacheAPI商業(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ù))的主接口(契約)??蛻舫绦蚩梢允荍SP、StrutsAction類,或者就是一個(gè)POJO對(duì)象。創(chuàng)建該接口用于對(duì)客戶端隱藏所有緩存的實(shí)現(xiàn)細(xì)節(jié),這樣當(dāng)我們將來需要切換另一種的第三方緩存API的時(shí)候無需對(duì)客戶端代碼做任何調(diào)整。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)行l(wèi)oadCacheObject方法)來重載緩存中的對(duì)象。ICacheKeyICacheKey接口創(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í)例。CacheElementInfo該類用于封裝所有的緩存統(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\tes目錄下。解壓縮示例代碼到一個(gè)新的web應(yīng)用目錄,如果要驗(yàn)證Junit測(cè)試腳本,從命令行運(yùn)行以下命令:切換當(dāng)前目錄到%TOMCAT_HOME%/webapps/web-app-name/WEB-INF/classe(在Unix測(cè)試環(huán)境中,目錄應(yīng)該是$TOMCAT_HOME/webapps/web-app-name/WEB-INF/class)5s3運(yùn)行以下命令:.pile編譯緩存框架中所有的Java類。?antcommon.runjunit用于運(yùn)行Junit測(cè)試腳本。測(cè)試腳本使用Log4JAPI來顯示所有的輸出信息??紤]何時(shí)使用對(duì)象緩存的指導(dǎo)方針當(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ì)象JackShirazi的著作Java性能調(diào)整提供了一個(gè)關(guān)于緩存主題的非常有趣的討論,討論了什么類型的數(shù)據(jù)應(yīng)該被緩存,以及何時(shí)使用緩存的建議。注意緩存框架并沒有處理在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)于如何將數(shù)據(jù)訪問層與業(yè)務(wù)邏輯層分離的知識(shí)。結(jié)論本文提供了對(duì)使用Jakarta的Java緩存系統(tǒng)(JCS)來為web門戶應(yīng)用開發(fā)對(duì)象緩存框架的概要介紹。該框架非常穩(wěn)定并可以被重用于其它任何web應(yīng)用,甚至可以用于客戶/服務(wù)器模式的Java應(yīng)用程序。本文詳細(xì)介紹了web門戶緩存框架的工作原理,并提供了Junit測(cè)試腳本來對(duì)不同場(chǎng)景的緩存框架進(jìn)行測(cè)試。JCSwasbuiltasasystemclosetoJCACHEJavaTemporaryCachingAPI(JSR-107),adescriptionofthecachingsystemusedinOracle9iandotherpopularcachingframeworks.該規(guī)范

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論