posts - 495,  comments - 11,  trackbacks - 0

          二級(jí)緩存

          ?????? 與Session相對(duì)的是,SessionFactory也提供了相應(yīng)的緩存機(jī)制。SessionFactory緩存可以依據(jù)功能和目的的不同而劃分為內(nèi)置緩存和外置緩存。

          ?????? SessionFactory的內(nèi)置緩存中存放了映射元數(shù)據(jù)和預(yù)定義SQL語句,映射元數(shù)據(jù)是映射文件中數(shù)據(jù)的副本,而預(yù)定義SQL語句是在Hibernate初始化階段根據(jù)映射元數(shù)據(jù)推導(dǎo)出來的。SessionFactory的內(nèi)置緩存是只讀的,應(yīng)用程序不能修改緩存中的映射元數(shù)據(jù)和預(yù)定義SQL語句,因此SessionFactory不需要進(jìn)行內(nèi)置緩存與映射文件的同步。

          ?????? SessionFactory的外置緩存是一個(gè)可配置的插件。在默認(rèn)情況下,SessionFactory不會(huì)啟用這個(gè)插件。外置緩存的數(shù)據(jù)是數(shù)據(jù)庫數(shù)據(jù)的副本,外置緩存的介質(zhì)可以是內(nèi)存或者硬盤。SessionFactory的外置緩存也被稱為Hibernate的二級(jí)緩存。

          ?????? Hibernate的二級(jí)緩存的實(shí)現(xiàn)原理與一級(jí)緩存是一樣的,也是通過以ID為key的Map來實(shí)現(xiàn)對(duì)對(duì)象的緩存。

          ?????? 由于Hibernate的二級(jí)緩存是作用在SessionFactory范圍內(nèi)的,因而它比一級(jí)緩存的范圍更廣,可以被所有的Session對(duì)象所共享。

          二級(jí)緩存的工作內(nèi)容

          ?????? Hibernate的二級(jí)緩存同一級(jí)緩存一樣,也是針對(duì)對(duì)象ID來進(jìn)行緩存。所以說,二級(jí)緩存的作用范圍是針對(duì)根據(jù)ID獲得對(duì)象的查詢。

          ?????? 二級(jí)緩存的工作可以概括為以下幾個(gè)部分:

          ●?? 在執(zhí)行各種條件查詢時(shí),如果所獲得的結(jié)果集為實(shí)體對(duì)象的集合,那么就會(huì)把所有的數(shù)據(jù)對(duì)象根據(jù)ID放入到二級(jí)緩存中。

          ●?? 當(dāng)Hibernate根據(jù)ID訪問數(shù)據(jù)對(duì)象的時(shí)候,首先會(huì)從Session一級(jí)緩存中查找,如果查不到并且配置了二級(jí)緩存,那么會(huì)從二級(jí)緩存中查找,如果還查不到,就會(huì)查詢數(shù)據(jù)庫,把結(jié)果按照ID放入到緩存中。

          ●?? 刪除、更新、增加數(shù)據(jù)的時(shí)候,同時(shí)更新緩存。

          二級(jí)緩存的適用范圍

          ?????? Hibernate的二級(jí)緩存作為一個(gè)可插入的組件在使用的時(shí)候也是可以進(jìn)行配置的,但并不是所有的對(duì)象都適合放在二級(jí)緩存中。

          ?????? 在通常情況下會(huì)將具有以下特征的數(shù)據(jù)放入到二級(jí)緩存中:

          ●?? 很少被修改的數(shù)據(jù)。

          ●?? 不是很重要的數(shù)據(jù),允許出現(xiàn)偶爾并發(fā)的數(shù)據(jù)。

          ●?? 不會(huì)被并發(fā)訪問的數(shù)據(jù)。

          ●?? 參考數(shù)據(jù)。

          ?????? 而對(duì)于具有以下特征的數(shù)據(jù)則不適合放在二級(jí)緩存中:

          ●?? 經(jīng)常被修改的數(shù)據(jù)。

          ●?? 財(cái)務(wù)數(shù)據(jù),絕對(duì)不允許出現(xiàn)并發(fā)。

          ●?? 與其他應(yīng)用共享的數(shù)據(jù)。

          ?????? 在這里特別要注意的是對(duì)放入緩存中的數(shù)據(jù)不能有第三方的應(yīng)用對(duì)數(shù)據(jù)進(jìn)行更改(其中也包括在自己程序中使用其他方式進(jìn)行數(shù)據(jù)的修改,例如,JDBC),因?yàn)槟菢親ibernate將不會(huì)知道數(shù)據(jù)已經(jīng)被修改,也就無法保證緩存中的數(shù)據(jù)與數(shù)據(jù)庫中數(shù)據(jù)的一致性。

          二級(jí)緩存組件

          ?????? 在默認(rèn)情況下,Hibernate會(huì)使用EHCache作為二級(jí)緩存組件。但是,可以通過設(shè)置hibernate.cache.provider_class屬性,指定其他的緩存策略,該緩存策略必須實(shí)現(xiàn)org.hibernate.cache.CacheProvider接口。

          ?????? 通過實(shí)現(xiàn)org.hibernate.cache.CacheProvider接口可以提供對(duì)不同二級(jí)緩存組件的支持。

          ?????? Hibernate內(nèi)置支持的二級(jí)緩存組件如表14.1所示。

          表14.1??? Hibernate所支持的二級(jí)緩存組件

          posted on 2009-07-19 21:23 jadmin 閱讀(51) 評(píng)論(0)  編輯  收藏

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 射阳县| 罗城| 宜阳县| 东方市| 双城市| 隆回县| 项城市| 思茅市| 都兰县| 富阳市| 绍兴县| 贵州省| 麻江县| 大理市| 鸡东县| 晋州市| 专栏| 洱源县| 平武县| 邹城市| 鹤壁市| 阿鲁科尔沁旗| 日照市| 五河县| 类乌齐县| 镇雄县| 五大连池市| 通州市| 古交市| 贵阳市| 棋牌| 兰考县| 阜平县| 林周县| 尚义县| 嵊州市| 恩平市| 海南省| 淳化县| 安顺市| 工布江达县|