一.關於快取:
其實對於快取而言,它其實就是一塊記憶體空間,在這個空間中存放了相互關聯的持久化物件, 也就是存在於session
快取內的物件,那麼
session
負責根據持久化物件的狀態變化來同步的更新資料庫。
session的快取是內建的不可解除安裝的,我們也稱其為一級快取,除了一級快取,
sessionfactory
有乙個內建的快取和乙個外接的快取,其中外接的快取是可插拔的快取外掛程式,也被稱為
hibernate
的二級快取。
二.快取的作用:
快取的作用是減低應用程式直接讀寫永久性資料儲存源的頻率,從而提**用的執行效能。
三.快取的實現原理
快取它是介於應用程式和永久性資料儲存源之間,那麼我們常見的永久性資料儲存源有硬碟上的檔案還有資料等,其實我們可以把快取中的資料理解成是資料儲存用中資料的拷貝,應用程式在執行時直接讀寫快取中的資料,只在某些特定的時刻按照快取中的資料來同步更新資料儲存源。
快取在軟體系統中的位置**:
四.持久化層快取的範圍
持久化層的快取的範圍決定了快取的生命週期以及可以被誰訪問。快取的範圍可以分為三類:事務範圍,程序範圍,群集範圍。
1.事務範圍:
我們通常說的一級快取,它就是乙個事務範圍的乙個快取,就是當事務提交了,或者事務回滾等操作,都是結束了乙個事務,那麼我們在開啟另乙個事務的時候,想在去獲取快取中的資料時,這時是獲取不到的。所以說快取的生命週期依賴於事務的生命週期,當乙個事務結束了,快取的生命週期也就結束了,那麼我們在這裡可以總結出每個事務都有自己獨自的快取。
事務範圍的快取儲存:
在同乙個事務的快取中,持久化類的每個物件具有唯一的oid
(相當於資料庫中表的主鍵,我們都知道主鍵是唯一的),所以相同的
oid不可能出現兩次,那麼我們還是以
emp(員工)和
dept
(部門)為例來看一下事務範圍的快取儲存:
2.程序範圍的快取:
快取可以被程序內的所有事務共享。程序範圍的快取可能會存放大量資料,它的物理介質可以是記憶體或硬碟。快取內的資料及可以採用相互關聯的物件形式,也可以採用物件的散裝資料形式:
01.程序範圍的快取存放相互關聯的物件:
上圖的資料存放形式,資料庫中oid為1的
dept
物件在記憶體中始終只有乙個拷貝。這種資料存放形式的優點是節省記憶體。但是我們要考慮在併發環境中,當執行不同事務的各個執行緒同時長時間操縱同乙個
oid為1的
dept
物件時,必須對這些執行緒進行同步,而同步會影響併發效能,並且很容易導致死鎖(兩個事務都要提交的場景),所以在程序範圍內部不建議使用這種資料存放機制。
02.程序範圍的快取儲存散裝資料:
如果快取中的資料採用的物件時散裝資料形式,那麼當不同的事務到快取中查詢oid
為dept
物件時,獲取的
dept
物件的散裝資料,每個事務都必須分別根據散裝資料重新構造出
dept
例項,也就是說,每個事務都會獲取不同的
dept
物件。3.群集範圍:
在群集環境中,快取被同乙個機器或多個機器上的多個程序共享。快取中的資料被複製到群集的環境中的每個程序節點,程序之間通過遠端通訊來保證快取中資料的一致性,快取中的資料通常是採用物件的散裝資料形式。
對於大多數應用,應該慎重的考慮是否需要使用群集範圍的快取,有時它未必能提高應用效能,應為訪問群集範圍的快取的速度不一定會比直接訪問資料庫的速度快多少。
五.快取的查詢機制
持久化層可以提供多種範圍的快取。如果在事務範圍的快取中沒有查詢到相應的資料,還可以到程序範圍或群集範圍的快取中查詢,如果在程序範圍或群集範圍的快取內沒有找到資料,那麼只能查詢資料庫。事務範圍的快取是持久化層的一級快取,它是必需要走的,程序範圍或群集範圍的快取是持久化層的第二級快取,它是可選的。
Hibernate之快取的原理
其實對於快取而言,它其實就是一塊記憶體空間,在這個空間中存放了相互關聯的持久化物件,也就是存在於session快取內的物件,那麼session負責根據持久化物件的狀態變化來同步的更新資料庫。session的快取是內建的不可解除安裝的,我們也稱其為一級快取,除了一級快取,sessionfactory有...
初學hibernate之快取
一 1 session級別快取屬於一級快取,持久化物件儲存在session一級快取中 一級快取引用持久化物件位址 只要session不關閉,一級快取就存在,快取中物件也不會被 session會在一些特定時間點,將快取中資料flush到資料庫中 transaction的commit 應用程式執行一些查...
hibernate快取,mybatis快取詳解
hibernate的快取有一級快取,二級快取,查詢快取。一級快取 很簡單,session級別的快取,通過get,update可以將物件放到一級快取中。二級快取 sessionfactory級別的快取,通過get,list可以將物件放到二級快取中,這裡我必須細講一下,list雖然能夠把物件放入二級快取...