日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國(guó)內(nèi)最全I(xiàn)T社區(qū)平臺(tái) 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁(yè) > 互聯(lián)網(wǎng) > Hibernate的cache

Hibernate的cache

來(lái)源:程序員人生   發(fā)布時(shí)間:2014-09-29 08:00:01 閱讀次數(shù):4278次
Cache就是緩存,它往往是提高系統(tǒng)性能的最重要手段,對(duì)數(shù)據(jù)起到一個(gè)蓄水池和緩沖的作用。Cache對(duì)于大量依賴數(shù)據(jù)讀取操作的系統(tǒng)而言尤其重要。在大并發(fā)量的情況下,如果每次程序都需要向數(shù)據(jù)庫(kù)直接做查詢操作,它們所帶來(lái)的性能開銷是顯而易見(jiàn)的,頻繁的網(wǎng)絡(luò)輿,數(shù)據(jù)庫(kù)磁盤的讀寫操作都會(huì)大大降低系統(tǒng)的性能。此時(shí)如果能讓數(shù)據(jù)庫(kù)在本地內(nèi)存中保留一個(gè)鏡像,下次訪問(wèn)的時(shí)候只需要從內(nèi)存中直接獲取,那么顯然可以帶來(lái)不小的性能提升。引入Cache機(jī)制的難點(diǎn)是如何保證內(nèi)存中數(shù)據(jù)的有效性,否則臟數(shù)據(jù)的出現(xiàn)將會(huì)給系統(tǒng)帶來(lái)難以預(yù)知的嚴(yán)重后果。雖然一個(gè)設(shè)計(jì)得很好的應(yīng)用程序不用Cache也可以表現(xiàn)出讓人接受的性能,但毫無(wú)疑問(wèn),一些對(duì)讀取操作要求比較高的應(yīng)用程序可以通過(guò)Cache獲得更高的性能。對(duì)于應(yīng)用程序,Cache通過(guò)內(nèi)存或磁盤保存了數(shù)據(jù)庫(kù)中的當(dāng)前有關(guān)數(shù)據(jù)狀態(tài),它是一個(gè)存儲(chǔ)在本地的數(shù)據(jù)備份。Cache位于數(shù)據(jù)庫(kù)和應(yīng)用程序之間,從數(shù)據(jù)庫(kù)更新數(shù)據(jù),并給程序提供數(shù)據(jù)。
Hibernate實(shí)現(xiàn)了良好的Cache機(jī)制,可以借助Hibernate內(nèi)部的Cache迅速提高系統(tǒng)的數(shù)據(jù)讀取性能。Hibernate中的Cache可分為兩層:一級(jí)Cache和二級(jí)Cache。
一級(jí)Cache:
Session實(shí)現(xiàn)了第一級(jí)Cache,它屬于事務(wù)級(jí)數(shù)據(jù)緩沖。一旦事務(wù)結(jié)束,這個(gè)Cache也隨之失效。一個(gè)Session的生命周期對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)事務(wù)或一個(gè)程序事務(wù)。
Session-cache保證了一個(gè)Session中兩次請(qǐng)求同一個(gè)對(duì)象時(shí),取得的對(duì)象是同一個(gè)JAVA實(shí)例,有時(shí)它可以避免不必要的數(shù)據(jù)沖突。另外,它還能為另一些重要的性能提供保證:
1:在對(duì)一個(gè)對(duì)象進(jìn)行自我循環(huán)引用時(shí), 不至于產(chǎn)生堆棧溢出。
2:當(dāng)數(shù)據(jù)庫(kù)事務(wù)結(jié)束時(shí),對(duì)于同一個(gè)數(shù)據(jù)庫(kù)行,不會(huì)產(chǎn)生數(shù)據(jù)沖突,因?yàn)閷?duì)于數(shù)據(jù)庫(kù)中的一行,最多只有一個(gè)對(duì)象來(lái)表示它。
3:一個(gè)事務(wù)中可能會(huì)有很多個(gè)處理單元,在每一個(gè)處理單元中做的操作都會(huì)立即被另外的處理單元得知。
我們不用刻意去打開Session-cache,它總是被打開并且不能被關(guān)閉。當(dāng)使用save(),update()或saveOrUpdate()來(lái)保存數(shù)據(jù)更改,或通過(guò)load(),find(),list()等方法來(lái)得到對(duì)象時(shí),對(duì)象就會(huì)被加入到Session-cache。
如果要同步很多數(shù)據(jù)對(duì)象,就需要有效地管理Cache,可以用Session的evict()方法從一級(jí)Cache中移除對(duì)象。如下:
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
for(int i = 0 ; i <100000 ; i++)
{
    Student stu = new Student();
    
    session.save(stu);
}

tx.commit();
session.close();
在保存50000個(gè)或更多對(duì)象時(shí),程序可能會(huì)拋出OutOfMemoryException異常,因?yàn)镠ibernate在一級(jí)Cache緩存了新加入的所有對(duì)象。內(nèi)存溢出。要解決這全問(wèn)題就需要把JDBC批處理數(shù)量設(shè)置為一個(gè)合理的數(shù)值(一般是10~20)。在Hibernate的配置文件中可以加入以下屬性
<property name="hibernate.jdbc.batch_size"> 20 </property>

然后我們?cè)诔绦蛑幸欢〞r(shí)刻就提交并更新Session的Cache:
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
for(int i = 0 ; i <100000 ; i++)
{
    Student stu = new Student();
    
    session.save(stu);
    if(i%20 == 0)    //每保存完20個(gè)對(duì)象后,進(jìn)行如下操作
    {
        session.flush();//這個(gè)會(huì)提交更新
        session.clear();//清除Cache,釋放內(nèi)存
    }

}

tx.commit();
session.close();

二級(jí)Cache
二級(jí)Cache是SessionFactory范圍內(nèi)的緩存,所有的Session共享同一個(gè)二級(jí)Cache。在二級(jí)Cache中保存持久性實(shí)例的散裝形式的數(shù)據(jù)。二級(jí)Cache的內(nèi)部如何實(shí)現(xiàn)并不重要,重要的是采用哪種正確的緩存策略,以及采用哪個(gè)Cache提供器。持久化不同的數(shù)據(jù)需要不同的Cache策略,比如一些因素將影響到Cache策略的選擇:數(shù)據(jù)的讀/寫比例,數(shù)據(jù)表是否能被其他的應(yīng)用程序揚(yáng)訪問(wèn)等。對(duì)于一些讀/寫比例高的數(shù)據(jù)可以打開它的緩存,允許這些數(shù)據(jù)進(jìn)入二級(jí)緩存容器有利于系統(tǒng)性能的優(yōu)化;而對(duì)于能被其它應(yīng)用程序訪問(wèn)的數(shù)據(jù)對(duì)象,最好將此對(duì)象的二級(jí)Cache選項(xiàng)關(guān)閉。
設(shè)置Hibernate的二級(jí)Cache需要分兩步進(jìn)行:首先確認(rèn)使用什么數(shù)據(jù)并發(fā)策略,然后配置緩存過(guò)期時(shí)間并設(shè)置Cache提供器。
有4種內(nèi)置的Hibernate數(shù)據(jù)并發(fā)沖突策略,代表數(shù)據(jù)庫(kù)隔離級(jí)別,如下:
1:事務(wù)(Transaction)僅在受管理的環(huán)境中可用。它保證可重讀的事務(wù)隔離級(jí)別,可以對(duì)讀/寫比例高,很少更新的數(shù)據(jù)采用該策略。
2:讀寫(read-write)使用時(shí)間戳機(jī)制維護(hù)讀寫提交事務(wù)隔離級(jí)別。可以對(duì)讀/寫比例高,很少更新的數(shù)據(jù)采用該策略。
3:非嚴(yán)格讀寫(notstrict-read-write)不保證Cache和數(shù)據(jù)庫(kù)之間的數(shù)據(jù)庫(kù)的一致性。使用此策略時(shí),應(yīng)該設(shè)置足夠的緩存過(guò)期時(shí)間,否則可能從緩存中讀出臟數(shù)據(jù)。當(dāng)一些數(shù)據(jù)極少改變,并且當(dāng)這些數(shù)據(jù)和數(shù)據(jù)庫(kù)有一部份不量影響不大時(shí),可以使用此策略。
4:只讀(read-only)當(dāng)確保數(shù)據(jù)永不改變時(shí),可以使用此策略。

我們確定了Cache策略后,就要挑選一個(gè)高效的Cache提供器,它將作為插件被Hibernate調(diào)用。Hibernate允許使用下述幾種緩存插件:
EhCache:可以在JVM中作為一個(gè)簡(jiǎn)單進(jìn)程范圍內(nèi)的緩存,它可以把緩存的數(shù)據(jù)放入內(nèi)存或磁盤,并支持Hibernate中可選用的查詢緩存。
OpenSymphony OSCache:和EhCache相似,并且提供了豐富的緩存過(guò)期策略。
SwarmCache:可作為集群范圍的緩存,但不支持查詢緩存。
JBossCache:可作為集群范圍的緩沖,但不支持查詢緩存。

在Hibernate中使用EhCache
EhCache是一個(gè)純JAVA程序,可以在Hibernate中作為一個(gè)插件引入。在Hibernate中使用EhCache需要在Hibernate的配置文件中設(shè)置如下:

<propery name="hibernate.cache.provider_class">
    org.hibernate.cache.EhCacheProvider
</property>
EhCacheProvider類是位于Hibernate3.jar包中而不是ehcache-1.1.jar包中。EhCache有自己的配置文檔,名為chcache.xml。Hibernate3.x中的etc目錄下有ehcache.xml的示例文件,只須要將 它COPY到我們的應(yīng)用程序src目錄下(編譯時(shí)會(huì)把ehcache.xmlCOPY到WEB-INF/classes目錄下)。對(duì)其中的相關(guān)值進(jìn)行更改以和自己的程序相適應(yīng)。進(jìn)行配置后,在ehcache.xml文件中的代碼如下:
<ehcache>
    <diskStore path="c:cache"/>    //設(shè)置cache.data文件存放位置

    <defaultCache
                
maxElementsInMemory="10000" //緩存中允許創(chuàng)建的最大對(duì)象數(shù)
                eternal
="false"    //緩存中對(duì)象是否為永久的
                timeToIdleSeconds
="120"//緩存數(shù)據(jù)鈍化時(shí)間(即對(duì)象在它過(guò)期前的空閑時(shí)間)
                timeToLiveSeconds
="120"//緩存數(shù)據(jù)生存時(shí)間(即對(duì)象在它過(guò)期前的生存時(shí)間)
                overflowToDisk
="true"
    
/>
    
    <cache name="Student"    //用戶自定義的Cache配置
                 maxElementsInMemory
="10000"
                 eternal
="false"
                 timeToIdleSeconds
="300"
                 timeToLiveSeconds
="600"
                 overflowToDisk
="true"
                 
/>
</ehcache>
此外我們還需要在持久化類的映射文件中進(jìn)行配置。例如,Group(班級(jí))和Student(學(xué)生)是一對(duì)多的關(guān)系,它們對(duì)應(yīng)的數(shù)據(jù)表分別是t_group和t_student。現(xiàn)在要把Student類的數(shù)據(jù)進(jìn)行二級(jí)緩存,這需要在二個(gè)映射文件中都對(duì)二級(jí)緩存進(jìn)行配置。
在Group.hbm.xml中如下
在其<set></set>中添加
<cache usage="read-write"/><!--集合中的數(shù)據(jù)被緩存-->
上述文件雖然在<set>標(biāo)記中設(shè)置了<cache usage="read-write"/>,但Hibernate只是把Group相關(guān)的Student的主鍵ID加入到緩存中,如果希望把整個(gè)Student的散裝屬性都加入到二級(jí)緩存中,還需要在Student.hbm.xml文件的<class>標(biāo)記中添加<cache>子標(biāo)記。如下:
<class name="Student" table="t_student">
    <cache usage="read-write" /><!--cache標(biāo)記需跟在class標(biāo)記后-->
</class>
生活不易,碼農(nóng)辛苦
如果您覺(jué)得本網(wǎng)站對(duì)您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈(zèng)
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 日韩欧美一区在线 | 亚洲欧洲视频在线观看 | 日本精品在线 | 国产自产| 中文二区 | 精品一区二区久久 | 久久国产精品免费视频 | 日韩国产一区二区 | 免费黄色在线观看 | www.av在 | 久久久久91视频 | 日本在线视频一区二区三区 | 日韩视频在线观看免费 | 二区欧美| 看片一区二区 | www久草| 中文在线视频观看 | 成人免费毛片高清视频 | 一区二区久久 | 麻豆传媒在线视频 | 欧美极品少妇xxxxⅹ免费视频 | 日本天堂在线观看 | a黄色片| 久久综合九色综合久久久精品综合 | 欧美日韩在线第一页 | 日韩精品在线观看视频 | 国产一区二区三区久久 | 成人免费福利 | 久久性色| 综合久久综合 | aⅴ一级片 | 亚洲成人高清在线 | 精品国产青草久久久久福利 | 日日噜噜噜夜夜爽爽狠狠视频97 | 国产精品一区二区三区久久 | 炮机高潮痉挛哭叫失禁 | 日韩精品视频一区二区三区 | 另类激情视频 | www.日| 日产精品久久久久久久性色 | 国产免费黄色片 |