hibernate二級緩存的實現(xiàn)_第1頁
hibernate二級緩存的實現(xiàn)_第2頁
hibernate二級緩存的實現(xiàn)_第3頁
hibernate二級緩存的實現(xiàn)_第4頁
hibernate二級緩存的實現(xiàn)_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、緩存就是數(shù)據(jù)庫數(shù)據(jù)在內存中的臨時容器,包括數(shù)據(jù)庫數(shù)據(jù)在內存中的臨時拷貝,它位j:數(shù)據(jù)庫與數(shù)據(jù)庫訪問層中間ORM在査詢數(shù)據(jù)時首先會根據(jù)自身的緩存管理策略,在緩存中査找和關數(shù)據(jù),如發(fā)現(xiàn)所需的數(shù)據(jù),則直接將此數(shù)據(jù)作為結果加以利用,從而避免了數(shù)據(jù)庫調用性能的開銷而相對內存操作而言,數(shù)據(jù)庫調用是一個代價高昂的過程.一般來講ORM中的緩存分為以下兒類:1事務級緩存:即在當前事務范圍內的數(shù)據(jù)緩存就Hibernate來講,事務級緩存是基J:Session的生命周期實現(xiàn)的,每個Session內部會存在一個數(shù)據(jù)緩存,它隨著Session的創(chuàng)建而存在,隨著Session的銷毀而滅亡,因此也稱為SessionLeve

2、lCache.2應用級緩存:即在某個應用中或應用中某個獨立數(shù)據(jù)庫訪問子集中的共享緩存,此緩存可由多個事務共享(數(shù)據(jù)庫事務或應用事務),事務之間的緩存共享策略與應用的事務隔離機制密切相關-在Hibemate中,應用級緩存由SessionFactoiy實現(xiàn),所有由一個SessionFactoiy創(chuàng)建的Session實例共享此緩存,因此也稱為SessionFactoiyLevelCache.3分布式緩存:即在多個應用實例,多個JVM間共享的緩存策略分布式緩存由多個應用級緩存實例組成,通過某種遠程機制赴實現(xiàn)各個緩存實例間的數(shù)據(jù)同步,任何一個實例的數(shù)據(jù)修改,將導致整個集群間的數(shù)據(jù)狀態(tài)同步.Hiberna

3、te數(shù)據(jù)緩存:內部緩存(SessionLevelCache也稱一級緩存):舉例說明:java代碼publicclassTestpublicvoidget()Sessionsession=HibemateSessionFactoiygetsessionf);TUsei*t=(TUsei*)session.get(hibemate.TUser,2);System.out.pnntln(tgetNameO);session.closeO,進彳亍測試:在控制臺打印出一條SQL語句:Hibernate:selecttusei*0_.idasid0_0_,tuserO_.nameasname0_0_,tu

4、serO_sexassex0_0_fi*omtest.t_usertuserO_whei*etusei*0_.id=?說明應行了一次數(shù)據(jù)両調用.一一一一一一代碼更改如卜:publicclassTestpublicvoidgetQSessionsession=HibemateSessionFactoiygetSessionO,TUsert=(TUser)session.getChibemate.TUser-,2);System.out.pnntln(tgetNameO),TUsertt=(TUser)session.get(hibemate.TUseiJ,2);System.out.pnntln

5、(tt.getNameO),session.closeO,再進彳了測試:進行了兩次査詢,控制臺仍然只打出一條SQL語句Hibernate:selecttuserO_.idasid0_0_,tuserO_nameasname0_0_,tuserO_.sexassex0_0_fromtestt_usertuserO_wheretuseiO_id=?說明還直只進行了一次數(shù)據(jù)庫的詢用.再將代碼更改如下:publicclassTestpublicvoidgetQSessionsession=HibemateSessionFactoiygetSessionO,TUsert=(TUser)session.g

6、etChibemate.TUser-,2);System.out.pnntln(tgetNameO),session.closeO,Sessionsession1=HibemateSessionFactoiygetsession。,TUsertt=(TUser)sessionl.getChibeiTiateTUsei*1,2),System.out.pnntln(tt.getNameO),sessionl.closeO,繼續(xù)測試:進行兩次査詢控制臺打印兩條SQL語句:HibernateselecttuserO_.idasldO0,tuseiO.nameasnameO0,tuseiOsexass

7、exO0fromtest.tusertuseiOwheretuserO_.id=?Hibernate:selecttuserO_.idasid0_0_,tuserO_.nameasname0_0_,tuserO_.sexassex0_0_fromtest.tusei*tuserOwheretuserOid=?結論Hibernate進行査詢時總是先在緩存中進行查詢,如緩存中沒有所需數(shù)據(jù)才進行數(shù)據(jù)庫的查詢.Hibernate的內部緩存是基J:Session的生命周期的,也就是說存在每個Session內部,它隨著Session的創(chuàng)建而存在,隨著Session的銷毀而滅亡,內部緩存一般由Hiberna

8、te自動維護,不需耍人為干預,當然我們也可以根據(jù)需要進行相應操作:Session.evict(Object)(將指定對彖從內部緩存清除),Session.clearOC清空內部緩存)(如在兩次查詢間加入Session.clearO將會清空內部緩存,使得一個Sesion內部的兩次相同的查詢耍對數(shù)據(jù)庫進行兩次操作).二級緩存:(有時稱為SessionFactoiyLevelCache)Hibernate本身并未提供二級緩存的產品化實現(xiàn)(只提供了一個基J:HashTable的簡單緩存以供調試),這里我使用的是第三方緩存組件EHcacheHibernate的二級緩存實現(xiàn)盂耍進行以下配置(Hibemat

9、e3):首先在hibernate.cfg.xml內添加org.hibeniate.cache.EhCacheProvidertme然后在映射文件中添加:測試上面代碼:控制臺輸出多了這樣一句WARN(CacheFactory.java:43)-read-onlycacheconfiguredformutableclasshibernateTUsei;級緩存啟用成功!!java代碼publicclassTestpublicvoidexecuteQueiyOListlist=newAirayListO,Sessionsession=HibemateSessionFactoiygetSessionO,

10、Queiyqueiy=session.createQueiyCfromTUsert1),query.setCacheable(tme),激活查詢緩存list=queiylistO,session.closeO,publicvoidgetOSessionsession=HibemateSessionFactoiygetSessionO,TUsert=(TUseisessiongetChibemateTUser-,2),System.out.pnntln(tgetNameO),session.closeQ,測試:控制臺只輸出一條SQL語句:Hibernate:selecttusei*O_idasi

11、dO_,tusei*O_nameasnameO_,tusei*O_.sexassexO_fi*omtestt_usei*tuserO_(即Queiyqueiy=session.a*eateQueiy(fromTUsert)這句代碼所對應的SQL).executeQueiyO方法與get。方法使用的是不同的Session!可是executeQueiy0方法與get。方法只對數(shù)據(jù)庫進行了一次操作,這就是二級緩存在起作用了.結論Hibernate二級緩存是SessionFactory級的緩存,它允許多個Session間共享,使用時需耍使用第三方的緩存組件,新版Hibernate將EHcache作為默

12、認的二級緩存實現(xiàn).緩存同步策略:緩存同步策略決定了數(shù)據(jù)對彖在緩存中的存取規(guī)則,我們必須為每個實體類指定相應的緩存同步策略.Hibernate中提供了4種不同的緩存同步策略(暫時只記個概念吧)read-only:只讀對不會發(fā)生改變的數(shù)據(jù)可使用(對數(shù)據(jù)只能査詢,其他的增刪改都會報錯不關是1或2緩存中).nonstnct-read-wnte:如果程序對并發(fā)訪問下的數(shù)據(jù)同步耍求不嚴格,且數(shù)據(jù)更新頻率較低,采用本緩存同步策略可獲得較好性能(不能在二級緩存進行増刪改都會報錯)read-wnte:嚴格的讀寫緩存一基丁時間澈判定機制,實現(xiàn)了readcommitted事務隔離等級用對數(shù)據(jù)同步要求的情況,但不支持

13、分布式緩存,實際應用中使用最多的緩存同步策略.(都可以比較常用的)transactional:事務型緩存,必須運行在JTA事務環(huán)境中此緩存中,緩存的相關操作被添加到事務中(此緩存類似/一個內存數(shù)據(jù)庫),如事務失敗,則緩沖池的數(shù)據(jù)會一同回滾到事務的開始之前的狀態(tài)事務型緩存實現(xiàn)了-Repeatableread11事務隔離等級,有效保證了數(shù)據(jù)的合法性,適應對關鍵數(shù)據(jù)的緩存,Hibernate內置緩存中,只有JBossCache支持事務型緩存.createtableteamEH(idvarchar(32),teamnamevarchar(32)createtablestudentEH(idvarcha

14、r(32),namevarchar(32),team_idvarchar(32),POJO:packageEHCache,publicclassStudentprivateStringid,標識idprivateStringname;學生姓名privateTeamteam,/班級publicStiinggetNameO.returnname,publicvoidsetId(Sfaingid).this.id=id,publicvoidsetName(StiingstuName)thisname=stuName,publicStiinggetldO.returnid,publicStudentf

15、).無參的構造函數(shù)publicTeamgetTeamO.returnteam,publicvoidsetTeam(Teamteam).this.team=team,packageEHCache,importjava.util.HashSet,importjava.util.Set,publicclassTeam.privateStringid,privateSetstudents,privateStringteamName,publicStiinggetldO.returnid,publicvoidsetId(Shingid).this.id=id,publicStiinggetTeamNam

16、eOreturnteamName,publicvoidsetTeamName(Stnngname).this.teamName=name,publicSetgetStudentsO.returnstudents,publicvoidsetStudents(Setstudents).this,students=students,Team,hbmxml其中標簽表示對student集合緩存,但只緩存id,如杲需要緩存student實例,則需要在student.hbm.xml中的class標簽中配置vcachev?xmlversion*1.0encodingutf-8?Mappingfileautog

17、eneratedbyMyEclipseHibernateTools-classname-EHCache.Team-table-teamEH1lazy-alseVgeneratorclass=uuid.hex1!-對students集合緩存,但只是緩存student-id如果耍對整個對象緩存,還需要在Studenthbm.xm1的class標簽中加入標簽Studenthbm.xmlv?xmlversion*1.0encodingutf-8?ODOCTYPEhibemate-mappingPUBLIC-/Hibemate/HibemateMappingDTD30/ENhttp/hibemate,s

18、ourceforgenet/hibematemaDping3.0.dtdclassname-EHCache.Studenttable=studentEHlazy=falseVgeneratorclass=uuid.hex11Hibernatecfg.xml配hibernate.cacheprovider_class以啟用EHCachepropertyname-connection,usernamerootpropertyname-connection,urljdbc:mysql:/localliost:3306/schoolproject?chaiacteiEncoding=gb2312&am

19、p,useUnicode=truepropertyname-dialectorg.hibeinate.dialectMySQLDialectpropertyname-myeclipseconnectionprofile11mysqlpropertyname-connectionpassv/ord111234propertyname-connection,dnverclasscommysql.jdbcDnverpropertyname-hibemate,dialect11org.hibeinate.dialectMySQLDialectpropertyname-hibemate.shovz_sq

20、ltiuepropertyname-current_session_context_classtliieadpropertyname-hibemate.cacheprovidei_classBorghibemate,cacheEhCachePiovider/session-factoryEHCache.xml(放在classpath卜)!-緩存文件存放位置-cachename=EHCache.Student1maxElementsInMemory1500eternal-falsetimeToIdleSeconds1201timeToLiveSeconds-1lZOoverflov/ToDlsk

21、true/-測試代碼(插入準備數(shù)據(jù)部分)packageEHCache,importjava.10File,importjava.util.List,importorghibemate.Session,importorghibernate.SessionFactoiy,importorghibemate.Tiansaction;importorghibernatecfgConfiguration,publicclassTest.publicstaticvoidmain(Stnngargs)StringfilePatli=System.getPropeity(userdir11)+Filesepa

22、ratoiH-1src/EHCache+File.separatois-11hibematecfg.xml,Filefile=newFile(filePath),SessionFactorysessionFactorypiewConfigurationOconfigure(file).buildSessionFactoiyOSessionsession=sessionFactoiyopenSessionO,Transactiontxession.beginTransactionO,/TeamteamnewTeamO,/team.setTeamName(teaml11),/for(inti=0,iSessionsession=sessionFactoiyopenSessionO,Transactiontxession.beginTransactionO,模擬多用戶訪問數(shù)據(jù)Sessionsessionl=sessionFactoiyopenSessionOTiansactiontxl=sessionl.beginTransactionO,Listlist=sessionlcieateQueiyCfromStudent11)HstQ,for(inti=Oi

溫馨提示

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

評論

0/150

提交評論