hibernate二級緩存理解

          緩存是介於應用程序和物理數據源之間,其做用是爲了下降應用程序對物理數據源訪問的頻次,從而提升了應用的運行性能。緩存內的數據是對物理數據源中的數據的複製,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。
          緩存的介質通常是內存,因此讀寫速度很快。但若是緩存中存放的數據量很是大時,也會用硬盤做爲緩存介質。緩存的實現不只僅要考慮存儲的介質,還要考慮到管理緩存的併發訪問和緩存數據的生命週期。

    Hibernate的緩存包括Session的緩存和SessionFactory的緩存。 算法

    其中SessionFactory的緩存又能夠分爲兩類:內置緩存和外置緩存。 數據庫

    Session的緩存是內置的,不能被卸載,也被稱爲Hibernate的第一級緩存。     緩存

    SessionFactory的內置緩存和Session的緩存在實現方式上比較類似,前者是SessionFactory對象的一些集合屬性包含的數據,後者是指Session的一些集合屬性包含的數據。 併發

    SessionFactory的內置緩存中存放了映射元數據(metadata)和預約義SQL語句(preparedstatement) 性能

    映射元數據是映射文件中數據的拷貝,而預約義SQL語句是在Hibernate初始化階段根據映射元數據推導出來 spa

    SessionFactory的內置緩存是隻讀的,應用程序不能修改緩存中的映射元數據和預約義SQL語句,所以SessionFactory不須要進行內置緩存與映射文件的同步。 hibernate

    SessionFactory的外置緩存是一個可配置的插件。在默認狀況下,SessionFactory不會啓用這個插件。外置緩存的數據是數據庫數據的拷貝,外置緩存的介質能夠是內存或者硬盤。SessionFactory的外置緩存也被稱爲Hibernate的第二級緩存。        

    Hibernate的這兩級緩存都位於持久化層,存放的都是數據庫數據的拷貝,那麼它們之間的區別是什麼呢?爲了理解兩者的區別,須要深刻理解持久化層的緩存的兩個特性:緩存的範圍和緩存的併發訪問策略
    
    持久化層的緩存的範圍

    緩存的範圍決定了緩存的生命週期以及能夠被誰訪問。緩存的範圍分爲三類。

      1 事務範圍:緩存只能被當前事務訪問。緩存的生命週期依賴於事務的生命週期,當事務結束時,緩存也就結束生命週期。在此範圍下,緩存的介質是內存。事務能夠是數據庫事務或者應用事務,每一個事務都有獨自的緩存,緩存內的數據一般採用相互關聯的的對象形式。

      2 進程範圍:緩存被進程內的全部事務共享。這些事務有多是併發訪問緩存,所以必須對緩存採起必要的事務隔離機制。緩存的生命週期依賴於進程的生命週期,進程結束時,緩存也就結束了生命週期。進程範圍的緩存可能會存放大量的數據,因此存放的介質能夠是內存或硬盤。緩存內的數據既能夠是相互關聯的對象形式也能夠是對象的鬆散數據形式。鬆散的對象數據形式有點相似於對象的序列化數據,可是對象分解爲鬆散的算法比對象序列化的算法要求更快。

      3 集羣範圍:在集羣環境中,緩存被一個機器或者多個機器的進程共享。緩存中的數據被複制到集羣環境中的每一個進程節點,進程間經過遠程通訊來保證緩存中的數據的一致性,緩存中的數據一般採用對象的鬆散數據形式。

      對大多數應用來講,應該慎重地考慮是否須要使用集羣範圍的緩存,由於訪問的速度不必定會比直接訪問數據庫數據的速度快多少。

      持久化層能夠提供多種範圍的緩存。若是在事務範圍的緩存中沒有查到相應的數據,還能夠到進程範圍或集羣範圍的緩存內查詢,若是仍是沒有查到,那麼只有到數據庫中查詢。事務範圍的緩存是持久化層的第一級緩存,一般它是必需的;進程範圍或集羣範圍的緩存是持久化層的第二級緩存,一般是可選的。
    
    持久化層的緩存的併發訪問策略

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

    在進程範圍或集羣範圍的緩存,即第二級緩存,會出現併發問題。所以能夠設定如下四種類型的併發訪問策略,每一種策略對應一種事務隔離級別。

      事務型(transactional):僅僅在受管理環境中適用。它提供了Repeatable Read事務隔離級別。對於常常被讀但不多修改的數據,能夠採用這種隔離類型,由於它能夠防止髒讀和不可重複讀這類的併發問題。

      讀寫型(read-write):提供了Read Committed事務隔離級別。僅僅在非集羣的環境中適用。對於常常被讀但不多修改的數據,能夠採用這種隔離類型,由於它能夠防止髒讀這類的併發問題。

      非嚴格讀寫型(nonstrict-read-write):不保證緩存與數據庫中數據的一致性。若是存在兩個事務同時訪問緩存中相同數據的可能,必須爲該數據配置一個很短的數據過時時間,從而儘可能避免髒讀。對於極少被修改,而且容許偶爾髒讀的數據,能夠採用這種併發訪問策略。

      只讀型(read-only):對於歷來不會修改的數據,如參考數據,可使用這種併發訪問策略。

      事務型併發訪問策略是事務隔離級別最高,只讀型的隔離級別最低。事務隔離級別越高,併發性能就越低。
    
    什麼樣的數據適合存放到第二級緩存中?
    
    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都要從緩存中清空。             插件

     當hibernate更新數據庫的時候,它怎麼知道更新哪些查詢緩存呢?      hibernate會在一個地方維護每一個表的最後更新時間,其實也就是放在net.sf.hibernate.cache.UpdateTimestampsCache所指定的緩存配置裏面,能夠去你配置的裏面找這個文件名稱.data。      當經過hibernate更新的時候,hibernate會知道此次更新影響了哪些表。而後它更新這些表的最後更新時間。每一個緩存都有一個建立時間和這個緩存所查詢的表,當hibernate查詢一個緩存是否存在的時候,若是緩存存在,它還要取出緩存的建立時間和這個緩存所查詢的表,而後去查找這些表的最後更新時間,若是有一個表在建立時間後更新過了,那麼這個緩存是無效的。 能夠看出,只要更新過一個表,那麼凡是涉及到這個表的查詢緩存就失效了,所以查詢緩存的命中率可能會比較低。
相關文章
相關標籤/搜索