SSH輕量級(jí)框架實(shí)踐課件:Hibernate高級(jí)特性_第1頁(yè)
SSH輕量級(jí)框架實(shí)踐課件:Hibernate高級(jí)特性_第2頁(yè)
SSH輕量級(jí)框架實(shí)踐課件:Hibernate高級(jí)特性_第3頁(yè)
SSH輕量級(jí)框架實(shí)踐課件:Hibernate高級(jí)特性_第4頁(yè)
SSH輕量級(jí)框架實(shí)踐課件:Hibernate高級(jí)特性_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Hibernate高級(jí)特性本章目標(biāo)了解Hibernate檢索策略掌握Hibernate延遲加載了解Hibernate緩存機(jī)制掌握Hibernate緩存配置方式本章簡(jiǎn)介在前面的內(nèi)容中,我們探討了Hibernate的基礎(chǔ)使用技術(shù)。通過對(duì)這些基礎(chǔ)技術(shù)的把握,我們即可開始進(jìn)行基于Hibernate的持久層開發(fā)。然而,在這些應(yīng)用技術(shù)之后,存在著怎樣的運(yùn)行機(jī)制以及其內(nèi)部實(shí)現(xiàn)方式對(duì)應(yīng)用層可能產(chǎn)生怎樣的影響,則是我們下面需要關(guān)注的問題。類級(jí)別檢索策略和關(guān)聯(lián)級(jí)別檢索策略類級(jí)別檢索策略又分為立即檢索和延遲檢索兩類,默認(rèn)的檢索策略是立即檢索。在Hibernate映射文件中,通過在<class>上配置lazy屬性來確定檢索策略。對(duì)于Session的檢索方式,類級(jí)別檢索策略僅適用于load()方法,也就說,對(duì)于get檢索和query檢索,持久化對(duì)象都會(huì)被立即加載而不管lazy的值是false還是true。一般來說,我們檢索對(duì)象就是要訪問它,因此立即檢索是通常的選擇。由于load()方法在檢索不到對(duì)象時(shí)會(huì)拋出異常(立即檢索的情況下),因此編者不建議使用load檢索。而且,由于<class>中的lazy屬性還影響到多對(duì)一及一對(duì)一的檢索策略,因此使用load方法就更沒必要了。一對(duì)多和多對(duì)多關(guān)聯(lián)關(guān)系一般使用<set>節(jié)點(diǎn)配置。<set>節(jié)點(diǎn)中有l(wèi)azy和outer-join屬性,它們的不同取值絕定了不同的檢索策略。立即檢索:這是一對(duì)多默認(rèn)的檢索策略,此時(shí)<set>節(jié)點(diǎn)的“l(fā)azy=false”,“outer-join=false”。盡管這是默認(rèn)的檢索策略,但如果關(guān)聯(lián)的集合是無用的,那么就不要使用這種檢索方式。延遲檢索:此時(shí)“l(fā)azy=true”,“outer-join=false”(outer-join=true是無意義的),這是優(yōu)先考慮的檢索方式。迫切左外連接檢索:此時(shí)“l(fā)azy=false”,“outer-join=true”,這種檢索策略只適用于依靠id檢索方式(例如load、get),而不適用于query的集合檢索(query檢索會(huì)采用立即檢索策略)。相比于立即檢索,這種檢索策略減少了一條sql語句,但在Hibernate中,只能有一個(gè)<set>節(jié)點(diǎn)配置成“outer-join=true”。多對(duì)一和一對(duì)一檢索策略一般使用<many-to-one>、<one-to-one>節(jié)點(diǎn)配置。<many-to-one>中需要配置的屬性是outer-join,同時(shí)還需要配置one端關(guān)聯(lián)的<class>節(jié)點(diǎn)的lazy屬性(注意:配置的不是<many-to-one>中的lazy哦),它們的組合后的檢索策略如下:<many-to-one>中的“outer-join=auto”:這是默認(rèn)值,如果one端關(guān)聯(lián)的<class>的“l(fā)azy=true”則為延遲檢索,如果one端關(guān)聯(lián)的<class>的“l(fā)azy=false”則為迫切左外連接檢索。<many-to-one>中的“outer-join=true”:無關(guān)于one端關(guān)聯(lián)的<class>的lazy屬性,都為迫切左外連接檢索。<many-to-one>中的“outer-join=false”:如果one端關(guān)聯(lián)的<class>的“l(fā)azy=true”則為延遲檢索,否則即為立即檢索。Hibernate延遲加載機(jī)制

實(shí)體對(duì)象的延遲加載集合類型的延遲加載什么是Hibernate緩存緩存是位于應(yīng)用程序與物理數(shù)據(jù)源之間,用于臨時(shí)存放復(fù)制數(shù)據(jù)的內(nèi)存區(qū)域,其目的是為了減少應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源訪問的次數(shù),從而提高應(yīng)用程序的運(yùn)行性能。Hibernate是一個(gè)持久層框架,經(jīng)常訪問物理數(shù)據(jù)庫(kù),為了降低應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源訪問的頻次,Hibernate緩存內(nèi)的數(shù)據(jù)是對(duì)物理數(shù)據(jù)源中的數(shù)據(jù)的復(fù)制,應(yīng)用程序在運(yùn)行時(shí)從緩存讀寫數(shù)據(jù),在特定的時(shí)刻或事件會(huì)同步緩存和物理數(shù)據(jù)源的數(shù)據(jù),從而提高應(yīng)用程序的運(yùn)行性能。Hibernate在查詢數(shù)據(jù)時(shí),首先到緩存中去查找,如果找到就直接使用,找不到的時(shí)候就會(huì)從物理數(shù)據(jù)源中檢索,所以,把頻繁使用的數(shù)據(jù)加載到緩存區(qū)后,就可以大大減少應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源的訪問,使得程序的運(yùn)行性能明顯的提升。Hibernate緩存的分類

Hibernate緩存包括兩大類:Hibernate一級(jí)緩存和Hibernate二級(jí)緩存。Hibernate一級(jí)緩存又稱為“session的緩存”,它是內(nèi)置的,不能被卸載(不能被卸載的意思就是這種緩存不具有可選性,必須有的功能,不可以取消session緩存)。Hibernate二級(jí)緩存又稱為“SessionFactory的緩存”,由于SessionFactory對(duì)象的生命周期和應(yīng)用程序的整個(gè)過程對(duì)應(yīng),因此Hibernate二級(jí)緩存是進(jìn)程范圍或者集群范圍的緩存,有可能出現(xiàn)并發(fā)問題,因此需要采用適當(dāng)?shù)牟l(fā)訪問策略,該策略為被緩存的數(shù)據(jù)提供了事務(wù)隔離級(jí)別。Hibernate的緩存管理一級(jí)緩存的管理Session中提供了如下幾個(gè)方法對(duì)一級(jí)緩存進(jìn)行管理:evit(Objectobj):將指定的持久化對(duì)象從一級(jí)緩存中清除,釋放對(duì)象所占用的內(nèi)存資源,指定對(duì)象從持久化狀態(tài)變?yōu)槊摴軤顟B(tài),從而成為游離對(duì)象。Clear():將一級(jí)緩存中的所有持久化對(duì)象清除,釋放其占用的內(nèi)存資源。Contains(Objectobj):判斷指定的對(duì)象是否存在于一級(jí)緩存中。flush():刷新一級(jí)緩存區(qū)的內(nèi)容,使之與數(shù)據(jù)庫(kù)數(shù)據(jù)保持同步。二級(jí)緩存的管理SessionFactory中提供了如下方法對(duì)二級(jí)緩存進(jìn)行管理:Evict(Classarg0,Serializablearg1):將某個(gè)類的指定ID的持久化對(duì)象從二級(jí)緩存中清除,釋放對(duì)象所占用的資源。Hibernate的二級(jí)緩存的配置Hibernate的二級(jí)緩存功能是靠配置二級(jí)緩存插件來實(shí)現(xiàn)的,為了集成這些插件,Hibernate提供了org.hibernate.cache.CacheProvider接口,它充當(dāng)緩存插件與Hibernate之間的適配器。EHCacheorg.hibernate.cache.EhCacheProviderOSCacheorg.hibernate.cache.OSCacheProviderSwarmCaheorg.hibernate.cache.SwarmCacheProviderJBossCacheorg.hibernate.cache.TreeCacheProviderHibernate的二級(jí)緩存策略的一般過程如下:條件查詢的時(shí)候,總是發(fā)出一條類似“select*fromtable_namewhere……”(選擇所有字段)這樣的SQL語句查詢數(shù)據(jù)庫(kù),一次獲得所有的數(shù)據(jù)對(duì)象。把獲得的所有數(shù)據(jù)對(duì)象根據(jù)ID放入到第二級(jí)緩存中。當(dāng)Hibernate根據(jù)ID訪問數(shù)據(jù)對(duì)象的時(shí)候,首先從Session一級(jí)緩存中查;查不到,如果配置了二級(jí)緩存,那么從二級(jí)緩存中查;查不到,再查詢數(shù)據(jù)庫(kù),把結(jié)果按照ID放入到緩存。刪除、更新、增加數(shù)據(jù)的時(shí)候,同時(shí)更新緩存。Hibernate的二級(jí)緩存策略,是針對(duì)于ID查詢的緩存策略,對(duì)于條件查詢則毫無作用。為此,Hibernate提供了針對(duì)條件查詢的Query緩存。使用Hibernate實(shí)現(xiàn)數(shù)據(jù)的刪改與修改類似,刪除時(shí)也需要先加載數(shù)據(jù)。在使用Hibernate編寫持久化代碼時(shí),不需要再有數(shù)據(jù)庫(kù)表、字段等概念。根據(jù)面向?qū)ο蟮恼Z義,刪除操作方法的參數(shù)理所當(dāng)然是將要?jiǎng)h除的對(duì)象,而不是主鍵。以面向?qū)ο蟮乃季S編寫代碼是Hibernate持久化操作接口設(shè)計(jì)的一個(gè)理念。Hibernate的Query緩存策略的過程如下Hibernate首先根據(jù)這些信息組成一個(gè)QueryKey,QueryKey包括條件查詢的請(qǐng)求一般信息:SQL,SQL需要的參數(shù),記錄范圍(起始位置rowStart,最大記錄個(gè)數(shù)maxRows),等。Hibernate根據(jù)這個(gè)QueryKey到Query緩存中查找對(duì)應(yīng)的結(jié)果列表。如果存在,那么返回這個(gè)結(jié)果列表;如果不存在,查詢數(shù)據(jù)庫(kù),獲取結(jié)果列表,把整個(gè)結(jié)果列表根據(jù)QueryKey放入到Query緩存中。QueryKey中的SQL涉及一些表名,如果這些表的任何數(shù)據(jù)發(fā)生修改、刪除、增加等操作,這些相關(guān)的QueryKey都要從緩存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(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)論