Hibernate 一級緩存,二級緩存,查詢緩存


概念:

1.什么是緩存呢?

   緩存:是計算機領域的概念,它介於應用程序和永久性數據存儲源之間。

   緩存:一般人的理解是在內存中的一塊空間,可以將二級緩存配置到硬盤。用白話來說,就是一個存儲數據的容器。我們關注的是,哪些數據需要被放入二級緩存。

   作用:降低應用程序直接讀寫數據庫的頻率,從而提高程序的運行性能。緩存中的數據是數據存儲源中數據的拷貝。緩存的物理介質通常是內存。

2.緩存在軟件系統中的位置

 

3.hibernate的緩存一般分為幾種?

  分為三種:一級緩存,二級緩存和查詢緩存

4.一級緩存

    01.session內的緩存即一級緩存,內置且不能被卸載,一個事務內有效。在這個空間存放了相互關聯的Java對象,這種位於session緩存內的對象也別稱為持久化對象,session負責根據持久化對象的狀態變化來同步更新數據庫。

    02.session為應用程序提供了管理緩存的方法:evict(Object o)和clear()

    03.一級緩存結論

       一級緩存的生命周期和session的生命周期一致,當前session一旦關閉,一級緩存就消失了,因此一級緩存也叫session級的緩存或事務級緩存,一級緩存只存實體對象,它不會緩存一般的對象屬性(查詢緩存可以),即當獲得對象后,就將該對象緩存起來,如果在同一session中再去獲取這個對象時,它會先判斷在緩存中有沒有該對象的id,如果有則直接從緩存中獲取此對象,反之才去數據庫中取,取的同時再將此對象作為一級緩存處理。

    04.以下方法支持一級緩存

        * get()    

        * load()    

        * iterate(查詢實體對象)

         其中 Query 和Criteria的list() 只會緩存,但不會使用緩存(除非結合查詢緩存)。

 

5.二級緩存

   01.二級緩存是進程(N個事務)或集群范圍內的緩存,可以被所有的Session共享,在多個事務之間共享。

    02.二級緩存是可配置的插件

   03.二級緩存的散裝數據

 

注意:如果緩存中的數據采用對象的散裝數據形式,那么當不用的事務到緩存中查詢OID為1的Customer對象時,獲得的是Customer對象的散裝數據,每個事務都必須分別根據散裝數據重新構造出Customer實例,也就是說,每個事務都會獲得不同的Customer對象。

   04.二級緩存機制

 

   05.二級緩存分為:類級別緩存,集合級別緩存,更新時間戳和查詢緩存。

   06.二級緩存的散裝原理圖

 

 

 

    07.類級別的二級緩存只適用於get和load獲取數據,對query接口的list()可以將數據放置到類級別的緩存中,但不能使用query接口的list()從緩存中獲取數據。

   08.注意點:修改一級緩存的數據,會自動同步到二級緩存。

   09.二級緩存結論

       二級緩存也稱進程級的緩存或SessionFactory級的緩存,二級緩存可以被所有session共享,二級緩存的生命周期和SessionFactory的生命周期一致。hibernate為實現二級緩存,只提供二級緩存的接口供第三方實現。二級緩存也是緩存實體對象,原理和方法都與一級緩存差不多,只是生命周期有所差異。

6.查詢緩存

     01.查詢是數據庫技術中最常用的操作,Hibernate為查詢提供了緩存,用來提高查詢速度,優化查詢性能相同HQL語句檢索結果的緩存!

     02.查詢緩存依賴於二級緩存,查詢緩存是針對普通屬性結果集的緩存,對實體對象的結果集只緩存id(其id不是對象的真正id,可以看成是HQL或者SQL語句,它與查詢的條件相關即where后的條件相關,不同的查詢條件,其緩存的id也不一樣)。查詢緩存的生命周期,當前關聯的表發生修改或是查詢條件改變時,那么查詢緩存生命周期結束,它不受一級緩存和二級緩存生命周期的影響,要想使用查詢緩存需要手動配置。

7.結論

     不要想當然的以為緩存可以提高性能,僅僅在你能夠駕馭它並且條件合適的情況下才是這樣的。hibernate的二級緩存限制還是比較多的。在不了解原理的情況下亂用,可能會有1+N的問題。不當的使用還可能導致讀出臟數據。 如果受不了hibernate的諸多限制,那么還是自己在應用程序的層面上做緩存吧。 

     在越高的層面上做緩存,效果就會越好。就好像盡管磁盤有緩存,數據庫還是要實現自己的緩存,盡管數據庫有緩存,咱們的應用程序還是要做緩存。因為底層的緩存它並不知道高層要用這些數據干什么,只能做的比較通用,而高層可以有針對性的實現緩存,所以在更高的級別上做緩存,效果也要好些吧。

      緩存是位於應用程序與物理數據源之間,用於臨時存放復制數據的內存區域,目的是為了減少應用程序對物理數據源訪問的次數,從而提高應用程序的運行性能.      Hibernate在查詢數據時,首先到緩存中去查找,如果找到就直接使用,找不到的時候就會從物理數據源中檢索,所以,把頻繁使用的數據加載到緩存區后,就可以大大減少應用程序對物理數據源的訪問,使得程序的運行性能明顯的提升. 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM