日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Hibernate緩存簡介及分類

一、Hibernate緩存簡介  Cache In Hibernate

專注于為中小企業(yè)提供成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)船山免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了1000+企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。

HIBERNATE中的CACHE有兩級(jí).

一級(jí)是在Session范圍內(nèi)的CACHE. 即每個(gè)Session有自己的一個(gè)CACHE, 當(dāng)前操作的對(duì)象都會(huì)被保留在CACHE中. 但是Session關(guān)閉后這個(gè)CACHE也就沒有. 可見這級(jí)CACHE的生命期是很短的. (使用id進(jìn)行關(guān)鍵字存儲(chǔ):緩存的key就是ID,value是POJO)(緩存的是實(shí)體對(duì)象)

另一級(jí)CACHE是在SessionFactory范圍的, 可以被來自同一個(gè)SessionFactory的Session共享. 在HIBERNATE的文檔中稱其為SECOND LEVEL CACHE. 顯然后者的優(yōu)勢(shì)較明顯, 也比較復(fù)合當(dāng)前的使用環(huán)境.   它可以使用不同的緩存實(shí)現(xiàn),如EhCache、JBossCache、OsCache等 (二級(jí)緩存是緩存實(shí)體對(duì)象的)

還有一個(gè)類型的CACHE就是QueryCache. 它的作用就是緩存一個(gè)Query以及Query返回對(duì)象的Identifier以及對(duì)象的類型. 有了QueryCache后就可以高效的使用SECOND LEVEL CACHE.

hibernate緩存查詢(hibernate默認(rèn)是關(guān)閉的)
查詢緩存是針對(duì)普通屬性結(jié)果集的緩存
對(duì)實(shí)體對(duì)象的結(jié)果集只緩存id
查詢緩存的生命周期,當(dāng)前關(guān)聯(lián)的表發(fā)生修改,那么查詢緩存生命周期結(jié)束

查詢緩存的配置和使用:

1. 啟用查詢緩存:在hibernate.cfg.xml中加入:

 
 
 
  1. < property name=”hibernate.cache.use_query_cache”>true< /property> 

2. 在程序中必須手動(dòng)啟用查詢緩存,如:query.setCacheable(true);

QueryCache用來緩存查詢語句, 及查詢結(jié)果集中對(duì)象的Identifier與Type. 當(dāng)再次使用已緩存的Query時(shí), 就可以通過對(duì)象的Identifier與Type在SECOND LEVEL CACHE中查找實(shí)際的對(duì)象.

對(duì)于查詢緩存來說,緩存的key是根據(jù)hql生成的sql,再加上參數(shù),分頁等信息(可以通過日志輸出看到,不過它的輸出不是很可讀,最好改一下它的代碼)。

注:一級(jí)緩存也叫session級(jí)的緩存或事務(wù)緩存。Hibernate二級(jí)緩存也稱為進(jìn)程級(jí)的緩存或SessionFactory級(jí)的緩存。二級(jí)緩存是全局緩存,它可以被所有的session共享。二級(jí)緩存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二級(jí)緩存。

二、Hibernate緩存的范圍

Hibernate緩存的范圍分為3類:
1.事務(wù)范圍
     事務(wù)范圍的緩存只能被當(dāng)前事務(wù)訪問,每個(gè)事務(wù)都有各自的緩存,緩存內(nèi)的數(shù)據(jù)通常采用相互關(guān)聯(lián)的對(duì)象形式.緩存的生命周期依賴于事務(wù)的生命周期,只有當(dāng)事務(wù)結(jié)束時(shí),緩存的生命周期才會(huì)結(jié)束.事務(wù)范圍的緩存使用內(nèi)存作為存儲(chǔ)介質(zhì),一級(jí)緩存就屬于事務(wù)范圍.
2.應(yīng)用范圍
     應(yīng)用程序的緩存可以被應(yīng)用范圍內(nèi)的所有事務(wù)共享訪問.緩存的生命周期依賴于應(yīng)用的生命周期,只有當(dāng)應(yīng)用結(jié)束時(shí),緩存的生命周期才會(huì)結(jié)束.應(yīng)用范圍的緩存可以使用內(nèi)存或硬盤作為存儲(chǔ)介質(zhì),二級(jí)緩存就屬于應(yīng)用范圍.
3.集群范圍
     在集群環(huán)境中,緩存被一個(gè)機(jī)器或多個(gè)機(jī)器的進(jìn)程共享,緩存中的數(shù)據(jù)被復(fù)制到集群環(huán)境中的每個(gè)進(jìn)程節(jié)點(diǎn),進(jìn)程間通過遠(yuǎn)程通信來保證緩存中的數(shù)據(jù)的一致,緩存中的數(shù)據(jù)通常采用對(duì)象的松散數(shù)據(jù)形式.

三、Hibernate緩存的方式

有四種,分別為:

CacheConcurrencyStrategy.NONE

CacheConcurrencyStrategy.READ_ONLY,只讀模式,在此模式下,如果對(duì)數(shù)據(jù)進(jìn)行更新操作,會(huì)有異常;

CacheConcurrencyStrategy.READ_WRITE,讀寫模式在更新緩存的時(shí)候會(huì)把緩存里面的數(shù)據(jù)換成一個(gè)鎖,其它事務(wù)如果去取相應(yīng)的緩存數(shù)據(jù),發(fā)現(xiàn)被鎖了,直接就去數(shù)據(jù)庫查詢;

CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,不嚴(yán)格的讀寫模式則不會(huì)的緩存數(shù)據(jù)加鎖;

CacheConcurrencyStrategy.TRANSACTIONAL,事務(wù)模式指緩存支持事務(wù),當(dāng)事務(wù)回滾時(shí),緩存也能回滾,只支持JTA環(huán)境。

緩存的注釋寫法如下,加在Entity的java類上:

@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)

四、Hibernate緩存的管理

一級(jí)緩存的管理:
evit(Object obj)  將指定的持久化對(duì)象從一級(jí)緩存中清除,釋放對(duì)象所占用的內(nèi)存資源,指定對(duì)象從持久化狀態(tài)變?yōu)槊摴軤顟B(tài),從而成為游離對(duì)象. 
clear()  將一級(jí)緩存中的所有持久化對(duì)象清除,釋放其占用的內(nèi)存資源 
contains(Object obj) 判斷指定的對(duì)象是否存在于一級(jí)緩存中. 
flush() 刷新一級(jí)緩存區(qū)的內(nèi)容,使之與數(shù)據(jù)庫數(shù)據(jù)保持同步.

二級(jí)緩存的管理:

evict(Class arg0, Serializable arg1)  將某個(gè)類的指定ID的持久化對(duì)象從二級(jí)緩存中清除,釋放對(duì)象所占用的資源.

evictCollection(String arg0)  將指定類的所有持久化對(duì)象的指定集合從二級(jí)緩存中清除,釋放其占用的內(nèi)存資源.

如何避免一次性大量的實(shí)體數(shù)據(jù)入庫導(dǎo)致內(nèi)存溢出
*先flush,再clear

如果數(shù)據(jù)量特別大,考慮采用jdbc實(shí)現(xiàn),如果jdbc也不能滿足要求,可以考慮采用數(shù)據(jù)庫本身的特定導(dǎo)入工具

五、什么樣的數(shù)據(jù)不適合放在二級(jí)緩存中來?

下面這幾種情況就不適合加載到二級(jí)緩存中: 
1.經(jīng)常被修改的數(shù)據(jù) 
2.絕對(duì)不允許出現(xiàn)并發(fā)訪問的數(shù)據(jù) 
3.與其他應(yīng)用共享的數(shù)據(jù) 
下面這己種情況合適加載到二級(jí)緩存中: 
1.數(shù)據(jù)更新頻率低 
2.允許偶爾出現(xiàn)并發(fā)問題的非重要數(shù)據(jù) 
3.不會(huì)被并發(fā)訪問的數(shù)據(jù) 
4.常量數(shù)據(jù) 
5.不會(huì)被第三方修改的數(shù)據(jù)

六、二級(jí)緩存的配置

Hibernate的二級(jí)緩存功能是靠配置二級(jí)緩存插件來實(shí)現(xiàn)的,Hibernate為了集成這些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充當(dāng)緩存插件與Hibernate之間的適配器 .

常用的二級(jí)緩存插件
EHCache  org.hibernate.cache.EhCacheProvider
OSCache  org.hibernate.cache.OSCacheProvider
SwarmCahe  org.hibernate.cache.SwarmCacheProvider
JBossCache  org.hibernate.cache.TreeCacheProvider

設(shè)置hibernate.cache.provider_class。

我們這里用ehcache,如
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
由于這是HIBERNATE默認(rèn)的CACHE提供者, 所以無須做什么設(shè)置.

只要在src中添加ehcache的配置文件ehcache.xml:

 
 
 
  1. < ehcache> 
  2.     < diskStore path="java.io.tmpdir"/>  
  3.     < defaultCache   maxElementsInMemory="10000"   eternal="false"  timeToIdleSeconds="120"          timeToLiveSeconds="120"  overflowToDisk="true"   />   
  4.     < cache name="goncha.hb.bean.Person"   maxElementsInMemory="10"       eternal="false"    
  5.         timeToIdleSeconds="100"  timeToLiveSeconds="100"  overflowToDisk="false"   />     
  6.       < cache name="goncha.hb.bean.Address"  maxElementsInMemory="10"     eternal="false"    
  7.         timeToIdleSeconds="100"  timeToLiveSeconds="100"  overflowToDisk="false"    />     
  8. < /ehcache>  

標(biāo)題名稱:Hibernate緩存簡介及分類
本文來源:http://m.5511xx.com/article/coeoepi.html