Hibernate的1級(jí)、2級(jí)Cache管理及EhCache的使用.docx_第1頁(yè)
Hibernate的1級(jí)、2級(jí)Cache管理及EhCache的使用.docx_第2頁(yè)
Hibernate的1級(jí)、2級(jí)Cache管理及EhCache的使用.docx_第3頁(yè)
Hibernate的1級(jí)、2級(jí)Cache管理及EhCache的使用.docx_第4頁(yè)
Hibernate的1級(jí)、2級(jí)Cache管理及EhCache的使用.docx_第5頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

Cache就是緩存,它往往是提高系統(tǒng)性能的最重要手段,對(duì)數(shù)據(jù)起到一個(gè)蓄水池和緩沖的作用。Cache對(duì)于大量依賴(lài)數(shù)據(jù)讀取操作的系統(tǒng)而言尤其重要。在大并發(fā)量的情況下,如果每次程序都需要向數(shù)據(jù)庫(kù)直接做查詢(xún)操作,它們所帶來(lái)的性能開(kāi)銷(xiāo)顯而易見(jiàn),頻繁的網(wǎng)絡(luò)傳輸、數(shù)據(jù)庫(kù)磁盤(pán)的讀寫(xiě)操作都會(huì)大大降低系統(tǒng)的整體性能。此時(shí),如果能把數(shù)據(jù)在本地內(nèi)存中保留一個(gè)鏡像,下次訪問(wèn)時(shí)只需從內(nèi)存中直接獲取,那么顯然可以帶來(lái)顯著的性能提升。引入Cache機(jī)制的難點(diǎn)是如何保證內(nèi)存中數(shù)據(jù)的有效性,否則臟數(shù)據(jù)的出現(xiàn)將會(huì)給系統(tǒng)帶來(lái)難以預(yù)知的嚴(yán)重后果。雖然一個(gè)設(shè)計(jì)得很好的應(yīng)用程序不用Cache也可以表現(xiàn)出讓人接受的性能,但毫無(wú)疑問(wèn),一些對(duì)讀操作要求很高的應(yīng)用程序可以通過(guò)Cache取得更高的性能。對(duì)于應(yīng)用程序,Cache通過(guò)內(nèi)存或磁盤(pán)保存了數(shù)據(jù)庫(kù)中當(dāng)前有關(guān)數(shù)據(jù)狀態(tài),它是一個(gè)存于當(dāng)?shù)氐臄?shù)據(jù)備份。Cache位于數(shù)據(jù)庫(kù)和應(yīng)用程序之間,從數(shù)據(jù)庫(kù)中更新數(shù)據(jù),并給程序提供數(shù)據(jù)。Hibernate實(shí)現(xiàn)了良好的Cache機(jī)制,可以借助Hibernate內(nèi)部的Cache迅速提高系統(tǒng)數(shù)據(jù)讀取性能。Hibernate中的Cache可分為兩層:一級(jí)Cache和二級(jí)Cache。一級(jí)CacheSession實(shí)現(xiàn)了第一級(jí)Cache,它屬于事務(wù)級(jí)數(shù)據(jù)緩沖。一旦事務(wù)結(jié)束,這個(gè)Cache也隨之失效。一個(gè)Session的生命周期對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)事務(wù)或一個(gè)程序事務(wù)。Session-cache保證在一個(gè)Session中兩次請(qǐng)求同一個(gè)對(duì)象時(shí),取得的對(duì)象是同一個(gè)Java實(shí)例,有時(shí)它可以避免不必要的數(shù)據(jù)沖突。另外,它還能保證另一些重要的性能。在對(duì)一個(gè)對(duì)象循環(huán)引用時(shí),不至于產(chǎn)生堆棧溢出。當(dāng)數(shù)據(jù)庫(kù)事務(wù)結(jié)束時(shí),對(duì)于同一數(shù)據(jù)庫(kù)行,不會(huì)產(chǎn)生數(shù)據(jù)沖突,因?yàn)閷?duì)于數(shù)據(jù)庫(kù)中的一行,至多有一個(gè)對(duì)象來(lái)表示它。一個(gè)事務(wù)中可能會(huì)有很多個(gè)處理單元,在一個(gè)處理單元中做的操作都會(huì)立即被另外的處理單元得知。不用刻意去打開(kāi)Session-cache,它總是被打開(kāi)并且不能被關(guān)閉。當(dāng)使用save()、update()或saveOrUpdate()來(lái)保存數(shù)據(jù)更改,或通過(guò)load()、find()、list()等方法來(lái)得到對(duì)象時(shí),對(duì)象就會(huì)被加入到Session-cache。如果要同步很大數(shù)量的對(duì)象,這是需要有效地管理Cache,可以用Session的evict()方法從一級(jí)Cache中移除對(duì)象。例如:Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction() ;for(int i=0; i100000 ;i+) Student stu = new Student();.session.save(stu);mit();session.close();在保存50 000個(gè)對(duì)象時(shí),程序可能拋出OutOfMemoryException異常,因?yàn)镠ibernate在一級(jí)Cache緩存了新加入數(shù)據(jù)庫(kù)的所有對(duì)象。要解決這個(gè)問(wèn)題,首先設(shè)置JDBC批處理數(shù)量到一個(gè)合理的數(shù)值(一般是1020)。在perties配置文件中設(shè)置如下:hibernate.jdbc.batch_size 20 或在hibernate.cfg.xml中設(shè)置如下: 20 然后在一定的時(shí)候提交更改并清空Session的Cache:Session session = HibernateUtil.currentSession();Transaction tx = session.beginTransaction() ;for(int i=0; i100000 ;i+) Student stu = new Student();.session.save(stu);if(i%20=0) /每保存完20個(gè)Student對(duì)象后,進(jìn)行以下操作session.flush(); /提交更新session.clear(); /清除Cache,釋放內(nèi)存mit();session.close(); 二級(jí)Cache 二級(jí)Cache是SessionFactory范圍內(nèi)的緩存,所有的Session共享同一個(gè)二級(jí)Cache。在二級(jí)Cache中保存持久性實(shí)例的散裝形式的數(shù)據(jù)。二級(jí)Cache的內(nèi)部是如何實(shí)現(xiàn)的并不重要,重要的是采用哪種正確的緩存策略,以及采用哪種Cache Providers。持久化不同的數(shù)據(jù)需要不同的Cache策略,比如說(shuō)一些因素將影響到Cache策略選擇:數(shù)據(jù)的讀/寫(xiě)比例、數(shù)據(jù)表是否能被其他的應(yīng)用程序所訪問(wèn)等。對(duì)于一些讀/寫(xiě)比例高的數(shù)據(jù)可以打開(kāi)它的緩存,允許這些數(shù)據(jù)進(jìn)入二級(jí)緩存容器有利于系統(tǒng)性能的優(yōu)化;而對(duì)于能被其他應(yīng)用程序訪問(wèn)的數(shù)據(jù)對(duì)象,最好將此對(duì)象的二級(jí)Cache選項(xiàng)關(guān)閉。設(shè)置Hibernate的二級(jí)Cache需要分兩步進(jìn)行:首先確認(rèn)使用什么數(shù)據(jù)并發(fā)策略,然后配置緩存過(guò)期時(shí)間和設(shè)置Cache提供器。有4種內(nèi)置的Hibernate數(shù)據(jù)并發(fā)沖突策略,代表了數(shù)據(jù)庫(kù)隔離級(jí)別,如下所示。transactional:僅在受管理的環(huán)境中可用。它保證可重讀的實(shí)物隔離級(jí)別,可以對(duì)讀/寫(xiě)比例高、很少更新的數(shù)據(jù)采用這種策略。read-write:使用timestamp機(jī)制維護(hù)讀已提交事務(wù)隔離級(jí)別。可以對(duì)讀/寫(xiě)比例高、很少更新的數(shù)據(jù)采用這策略。nonstrict-read-write:不保證Cache和數(shù)據(jù)庫(kù)之間的數(shù)據(jù)一致性。使用此策略時(shí),應(yīng)該設(shè)置足夠短的緩存過(guò)期時(shí)間,否則可能從緩存中讀出臟數(shù)據(jù)。當(dāng)一些數(shù)據(jù)極少改變,并且當(dāng)這些數(shù)據(jù)和數(shù)據(jù)庫(kù)有一部分不一致但影響不大時(shí),可以使用此策略。read-only:當(dāng)確保數(shù)據(jù)永不改變時(shí),可以使用此策略。確定了Cache策略之后,就要挑選一個(gè)合適高效的Cache提供器,它作為插件被Hibernate調(diào)用。Hibernate允許使用下述幾種緩存插件。EhCache:可以在JVM中作為一個(gè)簡(jiǎn)單進(jìn)程范圍的緩存,它可以把緩存的數(shù)據(jù)放入內(nèi)存或磁盤(pán),并支持Hibernate中可選用的查詢(xún)緩存。OpenSymphony OSCache:和EhCache相似,并且它提供了豐富的緩存過(guò)期策略。SwarmCache:可作為集群范圍的緩存,但不支持查詢(xún)緩存。JBossCache:可作為集群范圍的緩存,但不支持查詢(xún)緩存。上述4種緩存插件的對(duì)比情況列于表9-3中。表9-3 4種緩存插件的對(duì)比情況緩 存 插 件支 持 只 讀支持非嚴(yán)格讀寫(xiě)支 持 讀 寫(xiě)支 持 事 務(wù)EhCache是是是 OSCache是是是 SwarmCache是是 JBossCache是 是它們的提供器列于表9-4中。表9-4 緩存策略的提供器緩 存 插 件提供器(Cache Providers)Hashtable(只能測(cè)試時(shí)使用)org.hibernate.cache.HashtableCacheProviderEhCacheorg.hibernate.cache.EhCacheProviderOSCacheorg.hibernate.cache.OSCacheProviderSwarmCacheorg.hibernate.cache.SwarmCacheProviderJBossCacheorg.hibernate.cache.TreeCacheProvider在默認(rèn)情況下,Hibernate使用EhCache進(jìn)行JVM級(jí)別的緩存。用戶(hù)可以通過(guò)設(shè)置Hibernate配置文件中的vider_class的屬性,指定其他的緩存策略,該緩存策略必須實(shí)現(xiàn)org.hibernate.cache.CacheProvider接口。在Hibernate中使用EhCacheEhCache是一個(gè)純Java程序,可以在Hibernate中作為一個(gè)插件引入。它具有運(yùn)行速度快、結(jié)構(gòu)簡(jiǎn)單、占用內(nèi)存小、很小的依賴(lài)性、支持多CPU服務(wù)器、文檔齊全等特點(diǎn)。在Hibernate中使用EhCache,需要在hibernate.cfg.xml中設(shè)置如下:org.hibernate.cache.EhCacheProviderEhCacheProvider類(lèi)位于hibernate3.jar包中,而不是位于ehcache-1.1.jar包中。EhCache有自己的配置文檔,名為ehcache.xml。在Hibernate3.x中的etc目錄下有ehcache.xml的示范文件,將其復(fù)制應(yīng)用程序的src目錄下(編譯時(shí)會(huì)把ehcache.xml復(fù)制到WEB-INF/classess目錄下),對(duì)其中的相關(guān)值進(jìn)行更改以和自己的程序相適合。進(jìn)行配置后,在ehcache.xml文件中的全部代碼如下: /設(shè)置cache.data文件的存放位置 此外,還需要在持久化類(lèi)的映射文件中進(jìn)行配置。例如,Group(班級(jí))和Student(學(xué)生)是一對(duì)多的關(guān)系,它們對(duì)應(yīng)的數(shù)據(jù)表分別是t_group和t_student?,F(xiàn)在要把Student類(lèi)的數(shù)據(jù)進(jìn)行二級(jí)緩存,這需要在兩個(gè)映射文件(Student.hbm.xml和Group.hbm.xml)中都對(duì)二級(jí)緩存進(jìn)行配置。在Group.hbm.xml中配置二級(jí)緩存如下: hibernate-mappingclass name=Group table=t_group lazy=falseset name=students cascade=save-update inverse=true lazy=true /class/hibernate-mapping上述文件雖然在標(biāo)記中設(shè)置了,但Hibernate僅把和Group相關(guān)的Student的主鍵id加入到緩存中,如果希望把整個(gè)Student的

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論