概念:
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在查詢數據時,首先到緩存中去查找,如果找到就直接使用,找不到的時候就會從物理數據源中檢索,所以,把頻繁使用的數據加載到緩存區后,就可以大大減少應用程序對物理數據源的訪問,使得程序的運行性能明顯的提升.