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

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

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

    Vincent

    Vicent's blog
    隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
    數據加載中……

    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 都要從緩存中清空。

    posted on 2006-08-22 10:52 Binary 閱讀(167) 評論(0)  編輯  收藏 所屬分類: Hibernate

    主站蜘蛛池模板: 久久亚洲AV无码精品色午夜| 国产午夜亚洲精品不卡电影| 女人18毛片特级一级免费视频| 亚洲综合无码无在线观看| 亚洲国产综合无码一区二区二三区| gogo免费在线观看| 亚洲人成网站在线观看播放动漫 | 亚洲av午夜福利精品一区| 国产精品色拉拉免费看| 日韩在线视频播放免费视频完整版| 亚洲国产成人一区二区精品区 | 国产免费一区二区视频| 国产精品亚洲自在线播放页码| 亚洲午夜成人精品电影在线观看| 99re6在线视频精品免费下载| 国产精品成人亚洲| 亚洲成AV人片在线播放无码| 国产禁女女网站免费看| 日本免费人成视频在线观看| 国产精品久久亚洲一区二区| 亚洲视频一区网站| 亚洲精品乱码久久久久久蜜桃| **实干一级毛片aa免费| 亚洲一区二区三区免费| 亚洲中文字幕久久精品无码VA| 久久亚洲综合色一区二区三区| 国产大片91精品免费看3| 99re6热视频精品免费观看| 精品国产福利尤物免费| 亚洲欧美国产国产综合一区| 亚洲人成影院在线| 国产亚洲人成无码网在线观看| 国产免费啪嗒啪嗒视频看看| 亚洲一区二区三区免费视频| a视频在线免费观看| 国产午夜亚洲精品不卡| 亚洲日韩精品无码专区| 91亚洲精品麻豆| 亚洲日本一区二区三区| 亚洲码国产精品高潮在线| 国产免费观看青青草原网站|