




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、緩存就是數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的臨時(shí)容器,包括數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的臨時(shí)拷貝,它位j:數(shù)據(jù)庫與數(shù)據(jù)庫訪問層中間ORM在査詢數(shù)據(jù)時(shí)首先會(huì)根據(jù)自身的緩存管理策略,在緩存中査找和關(guān)數(shù)據(jù),如發(fā)現(xiàn)所需的數(shù)據(jù),則直接將此數(shù)據(jù)作為結(jié)果加以利用,從而避免了數(shù)據(jù)庫調(diào)用性能的開銷而相對內(nèi)存操作而言,數(shù)據(jù)庫調(diào)用是一個(gè)代價(jià)高昂的過程.一般來講ORM中的緩存分為以下兒類:1事務(wù)級緩存:即在當(dāng)前事務(wù)范圍內(nèi)的數(shù)據(jù)緩存就Hibernate來講,事務(wù)級緩存是基J:Session的生命周期實(shí)現(xiàn)的,每個(gè)Session內(nèi)部會(huì)存在一個(gè)數(shù)據(jù)緩存,它隨著Session的創(chuàng)建而存在,隨著Session的銷毀而滅亡,因此也稱為SessionLeve
2、lCache.2應(yīng)用級緩存:即在某個(gè)應(yīng)用中或應(yīng)用中某個(gè)獨(dú)立數(shù)據(jù)庫訪問子集中的共享緩存,此緩存可由多個(gè)事務(wù)共享(數(shù)據(jù)庫事務(wù)或應(yīng)用事務(wù)),事務(wù)之間的緩存共享策略與應(yīng)用的事務(wù)隔離機(jī)制密切相關(guān)-在Hibemate中,應(yīng)用級緩存由SessionFactoiy實(shí)現(xiàn),所有由一個(gè)SessionFactoiy創(chuàng)建的Session實(shí)例共享此緩存,因此也稱為SessionFactoiyLevelCache.3分布式緩存:即在多個(gè)應(yīng)用實(shí)例,多個(gè)JVM間共享的緩存策略分布式緩存由多個(gè)應(yīng)用級緩存實(shí)例組成,通過某種遠(yuǎn)程機(jī)制赴實(shí)現(xiàn)各個(gè)緩存實(shí)例間的數(shù)據(jù)同步,任何一個(gè)實(shí)例的數(shù)據(jù)修改,將導(dǎo)致整個(gè)集群間的數(shù)據(jù)狀態(tài)同步.Hiberna
3、te數(shù)據(jù)緩存:內(nèi)部緩存(SessionLevelCache也稱一級緩存):舉例說明:java代碼publicclassTestpublicvoidget()Sessionsession=HibemateSessionFactoiygetsessionf);TUsei*t=(TUsei*)session.get(hibemate.TUser,2);System.out.pnntln(tgetNameO);session.closeO,進(jìn)彳亍測試:在控制臺(tái)打印出一條SQL語句:Hibernate:selecttusei*0_.idasid0_0_,tuserO_.nameasname0_0_,tu
4、serO_sexassex0_0_fi*omtest.t_usertuserO_whei*etusei*0_.id=?說明應(yīng)行了一次數(shù)據(jù)両調(diào)用.一一一一一一代碼更改如卜: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,再進(jìn)彳了測試:進(jìn)行了兩次査詢,控制臺(tái)仍然只打出一條SQL語句Hibernate:selecttuserO_.idasid0_0_,tuserO_nameasname0_0_,tuserO_.sexassex0_0_fromtestt_usertuserO_wheretuseiO_id=?說明還直只進(jìn)行了一次數(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ù)測試:進(jìn)行兩次査詢控制臺(tái)打印兩條SQL語句:HibernateselecttuserO_.idasldO0,tuseiO.nameasnameO0,tuseiOsexass
7、exO0fromtest.tusertuseiOwheretuserO_.id=?Hibernate:selecttuserO_.idasid0_0_,tuserO_.nameasname0_0_,tuserO_.sexassex0_0_fromtest.tusei*tuserOwheretuserOid=?結(jié)論Hibernate進(jìn)行査詢時(shí)總是先在緩存中進(jìn)行查詢,如緩存中沒有所需數(shù)據(jù)才進(jìn)行數(shù)據(jù)庫的查詢.Hibernate的內(nèi)部緩存是基J:Session的生命周期的,也就是說存在每個(gè)Session內(nèi)部,它隨著Session的創(chuàng)建而存在,隨著Session的銷毀而滅亡,內(nèi)部緩存一般由Hiberna
8、te自動(dòng)維護(hù),不需耍人為干預(yù),當(dāng)然我們也可以根據(jù)需要進(jìn)行相應(yīng)操作:Session.evict(Object)(將指定對彖從內(nèi)部緩存清除),Session.clearOC清空內(nèi)部緩存)(如在兩次查詢間加入Session.clearO將會(huì)清空內(nèi)部緩存,使得一個(gè)Sesion內(nèi)部的兩次相同的查詢耍對數(shù)據(jù)庫進(jìn)行兩次操作).二級緩存:(有時(shí)稱為SessionFactoiyLevelCache)Hibernate本身并未提供二級緩存的產(chǎn)品化實(shí)現(xiàn)(只提供了一個(gè)基J:HashTable的簡單緩存以供調(diào)試),這里我使用的是第三方緩存組件EHcacheHibernate的二級緩存實(shí)現(xiàn)盂耍進(jìn)行以下配置(Hibemat
9、e3):首先在hibernate.cfg.xml內(nèi)添加org.hibeniate.cache.EhCacheProvidertme然后在映射文件中添加:測試上面代碼:控制臺(tái)輸出多了這樣一句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,測試:控制臺(tái)只輸出一條SQL語句:Hibernate:selecttusei*O_idasi
11、dO_,tusei*O_nameasnameO_,tusei*O_.sexassexO_fi*omtestt_usei*tuserO_(即Queiyqueiy=session.a*eateQueiy(fromTUsert)這句代碼所對應(yīng)的SQL).executeQueiyO方法與get。方法使用的是不同的Session!可是executeQueiy0方法與get。方法只對數(shù)據(jù)庫進(jìn)行了一次操作,這就是二級緩存在起作用了.結(jié)論Hibernate二級緩存是SessionFactory級的緩存,它允許多個(gè)Session間共享,使用時(shí)需耍使用第三方的緩存組件,新版Hibernate將EHcache作為默
12、認(rèn)的二級緩存實(shí)現(xiàn).緩存同步策略:緩存同步策略決定了數(shù)據(jù)對彖在緩存中的存取規(guī)則,我們必須為每個(gè)實(shí)體類指定相應(yīng)的緩存同步策略.Hibernate中提供了4種不同的緩存同步策略(暫時(shí)只記個(gè)概念吧)read-only:只讀對不會(huì)發(fā)生改變的數(shù)據(jù)可使用(對數(shù)據(jù)只能査詢,其他的增刪改都會(huì)報(bào)錯(cuò)不關(guān)是1或2緩存中).nonstnct-read-wnte:如果程序?qū)Σl(fā)訪問下的數(shù)據(jù)同步耍求不嚴(yán)格,且數(shù)據(jù)更新頻率較低,采用本緩存同步策略可獲得較好性能(不能在二級緩存進(jìn)行増刪改都會(huì)報(bào)錯(cuò))read-wnte:嚴(yán)格的讀寫緩存一基丁時(shí)間澈判定機(jī)制,實(shí)現(xiàn)了readcommitted事務(wù)隔離等級用對數(shù)據(jù)同步要求的情況,但不支持
13、分布式緩存,實(shí)際應(yīng)用中使用最多的緩存同步策略.(都可以比較常用的)transactional:事務(wù)型緩存,必須運(yùn)行在JTA事務(wù)環(huán)境中此緩存中,緩存的相關(guān)操作被添加到事務(wù)中(此緩存類似/一個(gè)內(nèi)存數(shù)據(jù)庫),如事務(wù)失敗,則緩沖池的數(shù)據(jù)會(huì)一同回滾到事務(wù)的開始之前的狀態(tài)事務(wù)型緩存實(shí)現(xiàn)了-Repeatableread11事務(wù)隔離等級,有效保證了數(shù)據(jù)的合法性,適應(yīng)對關(guān)鍵數(shù)據(jù)的緩存,Hibernate內(nèi)置緩存中,只有JBossCache支持事務(wù)型緩存.createtableteamEH(idvarchar(32),teamnamevarchar(32)createtablestudentEH(idvarcha
14、r(32),namevarchar(32),team_idvarchar(32),POJO:packageEHCache,publicclassStudentprivateStringid,標(biāo)識(shí)idprivateStringname;學(xué)生姓名privateTeamteam,/班級publicStiinggetNameO.returnname,publicvoidsetId(Sfaingid).this.id=id,publicvoidsetName(StiingstuName)thisname=stuName,publicStiinggetldO.returnid,publicStudentf
15、).無參的構(gòu)造函數(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其中標(biāo)簽表示對student集合緩存,但只緩存id,如杲需要緩存student實(shí)例,則需要在student.hbm.xml中的class標(biāo)簽中配置vcachev?xmlversion*1.0encodingutf-8?Mappingfileautog
17、eneratedbyMyEclipseHibernateTools-classname-EHCache.Team-table-teamEH1lazy-alseVgeneratorclass=uuid.hex1!-對students集合緩存,但只是緩存student-id如果耍對整個(gè)對象緩存,還需要在Studenthbm.xm1的class標(biāo)簽中加入標(biāo)簽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/-測試代碼(插入準(zhǔn)備數(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)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年中國低功耗LED燈行業(yè)市場發(fā)展前景及發(fā)展趨勢與投資戰(zhàn)略研究報(bào)告
- 健康知識(shí)講座課件圖片
- 健康看電視講課課件
- 醫(yī)藥安全政策解讀課件
- 2024年疊片機(jī)資金需求報(bào)告代可行性研究報(bào)告
- 2024年食品冷凍機(jī)械投資申請報(bào)告代可行性研究報(bào)告
- 蕭山區(qū)小區(qū)監(jiān)控管理辦法
- 蛋糕廠生產(chǎn)管理辦法標(biāo)準(zhǔn)
- 衡山縣村民建房管理辦法
- 健康活到百歲課件
- 車工考評員培訓(xùn)課件
- 2025年老年人能力評估師(三級)考試模擬試題(含答案)
- 站姿走姿坐姿禮儀培訓(xùn)
- 八大浪費(fèi)培訓(xùn)資料
- 小規(guī)模稅務(wù)視頻教學(xué)課件
- 業(yè)務(wù)外包費(fèi)用管理制度
- 月子中心各部管理制度
- 痛風(fēng)的康復(fù)護(hù)理課件
- 公司自供自產(chǎn)品管理制度
- 2025-2030年中國多西他賽注射液行業(yè)市場深度分析及發(fā)展趨勢與投資研究報(bào)告
- 五育并舉與心理健康教育的融合
評論
0/150
提交評論