<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
    數(shù)據(jù)加載中……

    Hibernate的緩存機制介紹

      緩存是介于應用程序和物理數(shù)據(jù)源之間,其作用是為了降低應用程序?qū)ξ锢頂?shù)據(jù)源訪問的頻次,從而提高了應用的運行性能。緩存內(nèi)的數(shù)據(jù)是對物理數(shù)據(jù)源中的數(shù)據(jù)的復制,應用程序在運行時從緩存讀寫數(shù)據(jù),在特定的時刻或事件會同步緩存和物理數(shù)據(jù)源的數(shù)據(jù)。

       緩存的介質(zhì)一般是內(nèi)存,所以讀寫速度很快。但如果緩存中存放的數(shù)據(jù)量非常大時,也會用硬盤作為緩存介質(zhì)。緩存的實現(xiàn)不僅僅要考慮存儲的介質(zhì),還要考慮到管理緩存的并發(fā)訪問和緩存數(shù)據(jù)的生命周期。

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

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

    持久化層的緩存的范圍

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

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

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

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

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

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

    持久化層的緩存的并發(fā)訪問策略

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

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

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

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

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

       只讀型:對于從來不會修改的數(shù)據(jù),如參考數(shù)據(jù),可以使用這種并發(fā)訪問策略。

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

    什么樣的數(shù)據(jù)適合存放到第二級緩存中?

    1 很少被修改的數(shù)據(jù)

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

    3 不會被并發(fā)訪問的數(shù)據(jù)

    4 參考數(shù)據(jù)

    不適合存放到第二級緩存的數(shù)據(jù)?

    1 經(jīng)常被修改的數(shù)據(jù)

    2 財務數(shù)據(jù),絕對不允許出現(xiàn)并發(fā)

    3 與其他應用共享的數(shù)據(jù)。

    Hibernate 的二級緩存

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

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

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

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

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

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

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

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

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

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

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

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

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

    主站蜘蛛池模板: 最近2019中文免费字幕在线观看| 亚洲系列中文字幕| 亚洲AV之男人的天堂| 国产麻豆免费观看91| 我要看免费的毛片| 欧洲乱码伦视频免费| 999久久久免费精品国产| 永久在线观看www免费视频| 久久午夜羞羞影院免费观看| 四虎影视在线影院在线观看免费视频| 青青操在线免费观看| 中文字幕无码日韩专区免费| 人妻丰满熟妇无码区免费| 亚洲免费人成视频观看| 91久久精品国产免费直播| 日韩精品福利片午夜免费观着| 免费黄色网址入口| 亚洲日韩在线观看| 亚洲国产精品va在线播放| 亚洲国产精品一区| 中文字幕 亚洲 有码 在线| 亚洲av日韩综合一区二区三区| 日韩亚洲综合精品国产| 国产精品免费看久久久香蕉| 成全动漫视频在线观看免费高清版下载| 免费91麻豆精品国产自产在线观看| 95免费观看体验区视频| 扒开双腿猛进入爽爽免费视频| 伊人久久亚洲综合影院| 国产亚洲无线码一区二区| 亚洲视频一区二区三区| 亚洲中文字幕无码久久2020 | 国产亚洲精品成人a v小说| 亚洲热线99精品视频| 综合自拍亚洲综合图不卡区| 中文字幕亚洲情99在线| 一级做a爱过程免费视| 亚洲视频在线观看免费| 午夜无遮挡羞羞漫画免费| 国产成人亚洲综合| 亚洲日韩中文字幕|