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

下載本文檔

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

文檔簡介

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

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論