<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Hibernate的緩存機制

    網上找到一些關于hibernate緩存的文章,個人覺得很不錯.整合了一下.
    http://www.javaresearch.org/article/53556.htm  Hibernate的緩存機制
    引用 :        緩存是介于應用程序和物理數據源之間,其作用是為了降低應用程序對物理數據源訪問的頻次,從而提高了應用的運行性能。緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
            緩存的介質一般是內存,所以讀寫速度很快。但如果緩存中存放的數據量非常大時,也會用硬盤作為緩存介質。緩存的實現不僅僅要考慮存儲的介質,還要考慮到管理緩存的并發訪問和緩存數據的生命周期。

    Hibernate的緩存包括Session的緩存和SessionFactory的緩存,其中SessionFactory的緩存又可以分為兩類:內置緩存和外置緩存。Session的緩存是內置的,不能被卸載,也被稱為Hibernate的第一級緩存。SessionFactory的內置緩存和 Session的緩存在實現方式上比較相似,前者是SessionFactory對象的一些集合屬性包含的數據,后者是指Session的一些集合屬性包含的數據。SessionFactory的內置緩存中存放了映射元數據和預定義SQL語句,映射元數據是映射文件中數據的拷貝,而預定義SQL語句是在 Hibernate初始化階段根據映射元數據推導出來,SessionFactory的內置緩存是只讀的,應用程序不能修改緩存中的映射元數據和預定義 SQL語句,因此SessionFactory不需要進行內置緩存與映射文件的同步。SessionFactory的外置緩存是一個可配置的插件。在默認情況下,SessionFactory不會啟用這個插件。外置緩存的數據是數據庫數據的拷貝,外置緩存的介質可以是內存或者硬盤。 SessionFactory的外置緩存也被稱為Hibernate的第二級緩存。

    Hibernate的這兩級緩存都位于持久化層,存放的都是數據庫數據的拷貝,那么它們之間的區別是什么呢?為了理解二者的區別,需要深入理解持久化層的緩存的兩個特性:緩存的范圍和緩存的并發訪問策略。

    持久化層的緩存的范圍

    緩存的范圍決定了緩存的生命周期以及可以被誰訪問。緩存的范圍分為三類。

    1 事務范圍:緩存只能被當前事務訪問。緩存的生命周期依賴于事務的生命周期,當事務結束時,緩存也就結束生命周期。在此范圍下,緩存的介質是內存。事務可以是數據庫事務或者應用事務,每個事務都有獨自的緩存,緩存內的數據通常采用相互關聯的的對象形式。

    2 進程范圍:緩存被進程內的所有事務共享。這些事務有可能是并發訪問緩存,因此必須對緩存采取必要的事務隔離機制。緩存的生命周期依賴于進程的生命周期,進程結束時,緩存也就結束了生命周期。進程范圍的緩存可能會存放大量的數據,所以存放的介質可以是內存或硬盤。緩存內的數據既可以是相互關聯的對象形式也可以是對象的松散數據形式。松散的對象數據形式有點類似于對象的序列化數據,但是對象分解為松散的算法比對象序列化的算法要求更快。

    3 集群范圍:在集群環境中,緩存被一個機器或者多個機器的進程共享。緩存中的數據被復制到集群環境中的每個進程節點,進程間通過遠程通信來保證緩存中的數據的一致性,緩存中的數據通常采用對象的松散數據形式。

    對大多數應用來說,應該慎重地考慮是否需要使用集群范圍的緩存,因為訪問的速度不一定會比直接訪問數據庫數據的速度快多少。

    持久化層可以提供多種范圍的緩存。如果在事務范圍的緩存中沒有查到相應的數據,還可以到進程范圍或集群范圍的緩存內查詢,如果還是沒有查到,那么只有到數據庫中查詢。事務范圍的緩存是持久化層的第一級緩存,通常它是必需的;進程范圍或集群范圍的緩存是持久化層的第二級緩存,通常是可選的。

    持久化層的緩存的并發訪問策略

    當多個并發的事務同時訪問持久化層的緩存的相同數據時,會引起并發問題,必須采用必要的事務隔離措施。

    在進程范圍或集群范圍的緩存,即第二級緩存,會出現并發問題。因此可以設定以下四種類型的并發訪問策略,每一種策略對應一種事務隔離級別。

    事務型:僅僅在受管理環境中適用。它提供了Repeatable Read事務隔離級別。對于經常被讀但很少修改的數據,可以采用這種隔離類型,因為它可以防止臟讀和不可重復讀這類的并發問題。

    讀寫型:提供了Read Committed事務隔離級別。僅僅在非集群的環境中適用。對于經常被讀但很少修改的數據,可以采用這種隔離類型,因為它可以防止臟讀這類的并發問題。

    非嚴格讀寫型:不保證緩存與數據庫中數據的一致性。如果存在兩個事務同時訪問緩存中相同數據的可能,必須為該數據配置一個很短的數據過期時間,從而盡量避免臟讀。對于極少被修改,并且允許偶爾臟讀的數據,可以采用這種并發訪問策略。   只讀型:對于從來不會修改的數據,如參考數據,可以使用這種并發訪問策略。

    事務型并發訪問策略是事務隔離級別最高,只讀型的隔離級別最低。事務隔離級別越高,并發性能就越低。

    什么樣的數據適合存放到第二級緩存中?

    1、很少被修改的數據 

    2、不是很重要的數據,允許出現偶爾并發的數據

    3、不會被并發訪問的數據

    4、參考數據

    不適合存放到第二級緩存的數據?

    1、經常被修改的數據

    2、財務數據,絕對不允許出現并發

    3、與其他應用共享的數據。

    Hibernate的二級緩存

    如前所述,Hibernate提供了兩級緩存,第一級是Session的緩存。由于Session對象的生命周期通常對應一個數據庫事務或者一個應用事務,因此它的緩存是事務范圍的緩存。第一級緩存是必需的,不允許而且事實上也無法比卸除。在第一級緩存中,持久化類的每個實例都具有唯一的OID。

    第二級緩存是一個可插拔的的緩存插件,它是由SessionFactory負責管理。由于SessionFactory對象的生命周期和應用程序的整個過程對應,因此第二級緩存是進程范圍或者集群范圍的緩存。這個緩存中存放的對象的松散數據。第二級對象有可能出現并發問題,因此需要采用適當的并發訪問策略,該策略為被緩存的數據提供了事務隔離級別。緩存適配器用于把具體的緩存實現軟件與Hibernate集成。第二級緩存是可選的,可以在每個類或每個集合的粒度上配置第二級緩存。

    Hibernate的二級緩存策略的一般過程如下:

    1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有字段)這樣的SQL語句查詢數據庫,一次獲得所有的數據對象。 

    2) 把獲得的所有數據對象根據ID放入到第二級緩存中。 

    3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。 

    4) 刪除、更新、增加數據的時候,同時更新緩存。

    Hibernate的二級緩存策略,是針對于ID查詢的緩存策略,對于條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query緩存。

    Hibernate的Query緩存策略的過程如下: 

    1) Hibernate首先根據這些信息組成一個Query Key,Query Key包括條件查詢的請求一般信息:SQL, SQL需要的參數,記錄范圍(起始位置rowStart,最大記錄個數maxRows),等。 

    2) Hibernate根據這個Query Key到Query緩存中查找對應的結果列表。如果存在,那么返回這個結果列表;如果不存在,查詢數據庫,獲取結果列表,把整個結果列表根據Query Key放入到Query緩存中。 

    3) Query Key中的SQL涉及到一些表名,如果這些表的任何數據發生修改、刪除、增加等操作,這些相關的Query Key都要從緩存中清空

    http://www.javaeye.com/topic/249465 Hibernate緩存機制

    引用 :  Hibernate的緩存管理

      一級緩存的管理:

          evit(Object obj)  將指定的持久化對象從一級緩存中清除,釋放對象所占用的內存資源,指定對象從持久化狀態變為脫管狀態,從而成為游離對象.
          clear()  將一級緩存中的所有持久化對象清除,釋放其占用的內存資源
          contains(Object obj) 判斷指定的對象是否存在于一級緩存中.
          flush() 刷新一級緩存區的內容,使之與數據庫數據保持同步.

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

          Hibernate的二級緩存功能是靠配置二級緩存插件來實現的,Hibernate為了集成這些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充當緩存插件與Hibernate之間的適配器 .

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

    簡單介紹一下EHCache的配置
    hibernate.cfg.xml
    Xml代碼: <hibernate-configuration>
        <session-factory>
           <!-- 設置二級緩存插件EHCache的Provider類-->
           <property name="hibernate.cache.provider_class">
              org.hibernate.cache.EhCacheProvider
           </property>
           <!-- 啟動"查詢緩存" -->
           <property name="hibernate.cache.use_query_cache">
              true
           </property>
        </session-factory>
      </hibernate-configuration>
    ehcache.xml
    Xml代碼:<ehcache>
      <!-- maxElementsInMemory為緩存對象的最大數目, eternal設置是否永遠不過期,timeToIdleSeconds對象處于空閑狀態的最多秒數,timeToLiveSeconds對象處于緩存狀態的最多秒數 -->
      <diskStore path="java.io.tmpdir"/>
        <defaultCache maxElementsInMemory="10000" eternal="false"  timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>
    </ehcache>
    ****.hbm.xml
    Xml代碼:

    <?xml version="1.0" encoding='UTF-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
                                "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
                                "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

    <hibernate-mapping>
        
       <class>
           <!-- 設置該持久化類的二級緩存并發訪問策略 read-only read-write nonstrict-read-write transactional-->
           <cache usage="read-write"/>   
       </class>

    </hibernate-mapping>



    posted on 2009-11-18 14:12 AK47 閱讀(227) 評論(0)  編輯  收藏 所屬分類: Hibernate


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2009年11月>
    25262728293031
    1234567
    891011121314
    15161718192021
    22232425262728
    293012345

    導航

    統計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 国产aa免费视频| 久久国产亚洲精品| 又大又黄又粗又爽的免费视频| 久久精品视频免费播放| 窝窝影视午夜看片免费| 亚洲中文字幕乱码AV波多JI| 亚洲国产精品无码久久久不卡| 四虎影视永久免费观看地址 | 免费A级毛片在线播放不收费| 69xx免费观看视频| 午夜精品免费在线观看 | 亚洲裸男gv网站| 国产又粗又长又硬免费视频| 无码精品A∨在线观看免费| 性xxxx视频免费播放直播| 高清永久免费观看| 夜夜爽妓女8888视频免费观看| 亚洲精品成a人在线观看夫| 亚洲国产精品久久网午夜| 亚洲视频一区二区三区| 亚洲AV第一页国产精品| 亚洲国产婷婷六月丁香| 伊人久久精品亚洲午夜| 亚洲欧洲精品成人久久奇米网| 国产大片51精品免费观看| 日韩免费观看的一级毛片| 午夜成年女人毛片免费观看| 无码中文字幕av免费放| 曰批视频免费30分钟成人| 国产乱子精品免费视观看片| 免费黄色福利视频| 成年人视频免费在线观看| 久久午夜夜伦鲁鲁片免费无码影视| 久久w5ww成w人免费| 每天更新的免费av片在线观看| 久久久久久曰本AV免费免费| 在线看片免费不卡人成视频| 国产成人免费爽爽爽视频| 天天拍拍天天爽免费视频| 日本免费福利视频| 国产日产亚洲系列最新|