Hibernate 快取
1. Cache簡介:
快取(Cache )是計算機領域非常通用的概念。它介於應用程式和永久性資料儲存源(如硬碟上的檔案或者資料庫)之間,其作用是降低應用程式直接讀寫永久性資料儲存源的頻 率,從而提高應用的執行效能。快取中的資料是資料儲存源中資料的拷貝,應用程式在執行時直接讀寫快取中的資料,只在某些特定時刻按照快取中的資料來同步更 新資料儲存源。快取的物理介質通常是記憶體,而永久性資料儲存源的物理介質通常是硬碟或磁碟,應用程式讀寫內在的速度顯然比讀寫硬碟的速度快,如果快取中存放的資料量非常大,也會用硬碟作為快取的物理介質。快取的實現不僅需要作為物理介質的硬體,同時還需要用於管理快取併發訪問和過期策略的軟體。因此,快取是通過軟體和硬體共同實現的。
1.1. 持久化層的快取的範圍
快取的範圍決定了快取的生命週期以及可以被誰訪問。快取的範圍分為三類。
1) 事務範圍:快取只能被當前事務訪問。快取的生命週期依賴於事務的生命週期,當事務結束時,快取也就結束生命週期。在此範圍下,快取的介質是記憶體。事務可以是資料庫事務或者應用事務,每個事務都有獨自的快取,快取內的資料通常採用相互關聯的物件形式。
2) 程序範圍:快取被程序內的所有事務共享。這些事務有可能是併發訪問快取,因此必須對快取採取必要的事務隔離機制。快取的生命週期依賴於程序的生命週期,進 程結束時,快取也就結束了生命週期。程序範圍的快取可能會存放大量的資料,所以存放的介質可以是記憶體或硬碟。快取內的資料既可以是相互關聯的物件形式也可 以是物件的鬆散資料形式。鬆散的物件資料形式有點類似於物件的序列化資料,但是物件分解為鬆散的演算法比物件序列化的演算法要求更快。
3) 叢集範圍:在叢集環境中,快取被一個機器或者多個機器的程序共享。快取中的資料被複制到叢集環境中的每個程序節點,程序間通過遠端通訊來保證快取中的資料的一致性,快取中的資料通常採用物件的鬆散資料形式。對大多數應用來說,應該慎重地考慮是否需要使用叢集範圍的快取,因為訪問的速度不一定會比直接訪問資料庫資料的速度快多少。
持久化層可以提供多種範圍的快取。如果在事務範圍的快取中沒有查到相應的資料,還可以到程序範圍或叢集範圍的快取內查詢,如果還是沒有查到,那 麼只有到資料庫中查詢。事務範圍的快取是持久化層的第一級快取,通常它是必需的;程序範圍或叢集範圍的快取是持久化層的第二級快取,通常是可選的。
1.2. 持久化層的快取的併發訪問策略
當多個併發的事務同時訪問持久化層的快取的相同資料時,會引起併發問題,必須採用必要的事務隔離措施。在程序範圍或叢集範圍的快取,即第二級快取,會出現併發問題。因此可以設定以下四種類型的併發訪問策略,每一種策略對應一種事務隔離級別。
1) 事務型(Transactional)策略:僅僅在受管理環境中適用。它提供了Repeatable Read事務隔離級別。對於經常被讀但很少修改的資料,可以採用這種隔離型別,因為它可以防止髒讀和不可重複讀這類的併發問題。
2) 讀寫型(read-write)策略:提供了Read Committed事務隔離級別。僅僅在非叢集的環境中適用。對於經常被讀但很少修改的資料,可以採用這種隔離型別,因為它可以防止髒讀這類的併發問題。
3) 非嚴格讀寫型(nonstrict-read-write)策略:不保證快取與資料庫中資料的一致性。如果存在兩個事務同時訪問快取中相同資料的可能,必 須為該資料配置一個很短的資料過期時間,從而儘量避免髒讀。對於極少被修改,並且允許偶爾髒讀的資料,可以採用這種併發訪問策略。
4) 只讀型策略(read-only):對於從來不會修改的資料,如參考資料,可以使用這種併發訪問策略。
事務型併發訪問策略是事務隔離級別最高,只讀型的隔離級別最低。事務隔離級別越高,併發效能就越低。
2. Hibernate中的快取:
Hibernate中提供了兩級Cache,第一級別的快取是Session級別的快取,它是屬於事務範圍的快取。這一級別的快取由hibernate管理的,一般情況下無需進行干預;第二級別的快取是SessionFactory級別 的快取,它是屬於程序範圍或群集範圍的快取。這一級別的快取可以進行配置和更改,並且可以動態載入和解除安裝。Hibernate還為查詢結果提供了一個查詢快取,它依賴於第二級快取。
2.1. 一級快取和二級快取的比較:
存放資料的形式 | 相互關聯的持久化物件 | 物件的散裝資料 |
快取的範圍 | 事務範圍,每個事務都有單獨的第一級快取 | 程序範圍或叢集範圍,快取被同一個程序或叢集範圍內的所有事務共享 |
併發訪問策略 | 由於每個事務都擁有單獨的第一級快取,不會出現併發問題,無需提供併發訪問策略 | 由於多個事務會同時訪問第二級快取中相同資料,因此必須提供適當的併發訪問策略,來保證特定的事務隔離級別 |
資料過期策略 | 沒有提供資料過期策略。處於一級快取中的物件永遠不會過期,除非應用程式顯式清空快取或者清除特定的物件 | 必須提供資料過期策略,如基於記憶體的快取中的物件的最大數目,允許物件處於快取中的最長時間,以及允許物件處於快取中的最長空閒時間 |
物理儲存介質 | 記憶體 | 記憶體和硬碟。物件的散裝資料首先存放在基於內在的快取中,當記憶體中物件的數目達到資料過期策略中指定上限時,就會把其餘的物件寫入基於硬碟的快取中。 |
快取的軟體實現 | 在Hibernate的Session的實現中包含了快取的實現 | 由第三方提供,Hibernate僅提供了快取介面卡(CacheProvider)。用於把特定的快取外掛整合到Hibernate中。 |
啟 用快取的方式 | 只要應用程式通過Session介面來執行儲存、更新、刪除、載入和查詢資料庫資料的操作,Hibernate就會啟用第一級快取,把資料庫中的資料以對 象的形式拷貝到快取中,對於批量更新和批量刪除操作,如果不希望啟用第一級快取,可以繞過Hibernate API,直接通過JDBC API來執行指操作。 | 使用者可以在單個類或類的單個集合的粒度上配置第二級快取。如果類的例項被經常讀但很少被修改,就可以考慮使用第二級快取。只有為某個類或集合配置了第二級 快取,Hibernate在執行時才會把它的例項加入到第二級快取中。 |
使用者管理快取的方式 | 第一級快取的物理介質為記憶體,由於記憶體容量有限,必須通過恰當的檢索策略和檢索方式來限制載入物件的數目。Session的evit()方法可以顯式清空 快取中特定物件,但這種方法不值得推薦。 | 二級快取的物理介質可以是記憶體和硬碟,因此第二級快取可以存放大量的資料,資料過期策略的maxElementsInMemory屬性值可以控制記憶體中 的物件數目。管理第二級快取主要包括兩個方面:選擇需要使用第二級快取的持久類,設定合適的併發訪問策略:選擇快取介面卡,設定合適的資料過期策略。 |
2.2. 一級快取的管理:
當應用程式呼叫Session的save()、update()、savaeOrUpdate()、 get()或load(),以及呼叫查詢介面的list()、iterate()或filter()方法時,如果在Session快取中還不存在相應的對 象,Hibernate就會把該物件加入到第一級快取中。當清理快取時,Hibernate會根據快取中物件的狀態變化來同步更新資料庫。
Session為應用程式提供了兩個管理快取的方法:
evict(Object obj):從快取中清除引數指定的持久化物件。
clear():清空快取中所有持久化物件。
2.3. 二級快取的管理:
2.3.1. Hibernate的二級快取策略的一般過程如下:
1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的資料物件。
2) 把獲得的所有資料物件根據ID放入到第二級快取中。
3) 當Hibernate根據ID訪問資料物件的時候,首先從Session一級快取中查;查不到,如果配置了二級快取,那麼從二級快取中查;查不到,再查詢資料庫,把結果按照ID放入到快取。
4) 刪除、更新、增加資料的時候,同時更新快取。
Hibernate的二級快取策略,是針對於ID查詢的快取策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。
2.3.2. 什麼樣的資料適合存放到第二級快取中?
1 很少被修改的資料
2 不是很重要的資料,允許出現偶爾併發的資料
3 不會被併發訪問的資料
4 參考資料,指的是供應用參考的常量資料,它的例項數目有限,它的例項會被許多其他類的例項引用,例項極少或者從來不會被修改。
2.3.3. 不適合存放到第二級快取的資料?
1 經常被修改的資料
2 財務資料,絕對不允許出現併發
3 與其他應用共享的資料。
2.3.4. 常用的快取外掛
Hibernater 的二級快取是一個外掛,下面是幾種常用的快取外掛:
l EhCache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,對Hibernate的查詢快取提供了支援。
l OSCache:可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,提供了豐富的快取資料過期策略,對Hibernate的查詢快取提供了支援。
l SwarmCache:可作為群集範圍內的快取,但不支援Hibernate的查詢快取。
l JBossCache:可作為群集範圍內的快取,支援事務型併發訪問策略,對Hibernate的查詢快取提供了支援。
1. 快取對映(Cache mappings)
類或者集合對映的“<cache>元素”可以有下列形式:
<cache
usage="transactional|read-write|nonstrict-read-write|read-only"
region="RegionName"
include="all|non-lazy"
/>
usage(必須)說明了快取的策略: transactional、 read-write、 nonstrict-read-write或 read-only。 |
region (可選, 預設為類或者集合的名字(class or collection role name)) 指定第二級快取的區域名(name of the second level cache region) |
include (可選,預設為 all) non-lazy 當屬性級延遲抓取開啟時, 標記為lazy="true"的實體的屬性可能無法被快取 |
另外(首選?), 你可以在hibernate.cfg.xml中指定<class-cache>和 <collection-cache> 元素。
這裡的usage 屬性指明瞭快取併發策略(cache concurrency strategy)。
2.1 策略:只讀快取(Strategy: read only)
如果你的應用程式只需讀取一個持久化類的例項,而無需對其修改, 那麼就可以對其進行只讀 快取。這是最簡單,也是實用性最好的方法。甚至在叢集中,它也能完美地運作。
<class name="eg.Immutable" mutable="false">
<cache usage="read-only"/>
....
</class>
2.2. 策略:讀/寫快取(Strategy: read/write)
如果應用程式需要更新資料,那麼使用讀/寫快取 比較合適。 如果應用程式要求“序列化事務”的隔離級別(serializable transaction isolation level),那麼就決不能使用這種快取策略。 如果在JTA環境中使用快取,你必須指定hibernate.transaction.manager_lookup_class屬性的值, 通過它,Hibernate才能知道該應用程式中JTA的TransactionManager的具體策略。 在其它環境中,你必須保證在Session.close()、或Session.disconnect()呼叫前, 整個事務已經結束。 如果你想在叢集環境中使用此策略,你必須保證底層的快取實現支援鎖定(locking)。Hibernate內建的快取策略並不支援鎖定功能。
<class name="eg.Cat" .... >
<cache usage="read-write"/>
....
<set name="kittens" ... >
<cache usage="read-write"/>
....
</set>
</class>
2.3. 策略:非嚴格讀/寫快取(Strategy: nonstrict read/write)
如果應用程式只偶爾需要更新資料(也就是說,兩個事務同時更新同一記錄的情況很不常見),也不需要十分嚴格的事務隔離, 那麼比較適合使用非嚴格讀/寫快取策略。如果在JTA環境中使用該策略, 你必須為其指定hibernate.transaction.manager_lookup_class屬性的值, 在其它環境中,你必須保證在Session.close()、或Session.disconnect()呼叫前, 整個事務已經結束。
2.4. 策略:事務快取(transactional)
Hibernate的事務快取策略提供了全事務的快取支援, 例如對JBoss TreeCache的支援。這樣的快取只能用於JTA環境中,你必須指定 為其hibernate.transaction.manager_lookup_class屬性。
沒有一種快取提供商能夠支援上列的所有快取併發策略。下表中列出了各種提供器、及其各自適用的併發策略。
表: 各種快取提供商對快取併發策略的支援情況(Cache Concurrency Strategy Support)
Cache |
read-only |
nonstrict-read-write |
read-write |
transactional |
Hashtable (not intended for production use) |
yes |
yes |
yes |
|
EHCache |
yes |
yes |
yes |
|
OSCache |
yes |
yes |
yes |
|
SwarmCache |
yes |
yes |
||
JBoss TreeCache |
yes |
yes |
相關推薦
hibernate——快取
/** * Created by Administrator on 2018/11/16 0016. * 一級快取 Session * 二級快取 SessionFactory * 查詢快取 createQuery */ 一級快取 get,load方
Hibernate快取小結
Hibernate快取 Hibernate一級快取又稱為“Session的快取”,它是內建的,意思就是說,只要你使用hibernate就必須使用session快取。由於Session物件的生命週期通常對應一個數據庫事務或者一個應用事務,因此它的快取是事務範圍的快取。在第一級快取中,持久化類的每個例項都具有唯
hibernate快取:一級快取和二級快取理解
一、什麼是快取: 快取是指為了降低應用程式對物理資料來源訪問的頻次從而提高應用程式的執行效能的一種策略。 二、為什麼使用快取: 1.ORM框架訪問資料庫的效率直接影響應用程式的執行速度,提升和優化ORM框架的執行效率至關重要。 2.Hibernate的快取是提升和
hibernate快取
Cache就是快取,它往往是提高系統性能的最重要手段,對資料起到一個蓄水池和緩衝的作用。Cache對於大量依賴資料讀取操作的系統而言尤其重要。 一級快取session: Hibernate預設是開啟一級快取的,一級快取存放在session上,屬於事務級資料緩衝。
Hibernate快取機制
快取:為了降低應用程式對物理資料來源訪問的頻次,從而提高應用程式的執行效能。 快取的工作原理: 物理資料來源——>(資料)快取——>(資料)記憶體 在應用程式中首先會選擇在快取中讀取資料,如果快取中沒有再選擇在資料庫中讀取並把讀取的資料放到快取中;有點類似暫存器
Hibernate 快取,快照,Session.currentSession和getSession的區別
1,事務快取 Hibernate的預設快取(不能被取消),單會話快取(一級快取)。其只能被當前事務訪問,每個事務都有自己的快取 生命週期依賴於事務的生命週期:當事務結束時,快取的生命週期也結束(事務快取使用記憶體作為快取介質
Spring+Hibernate 快取不起作用
最近做的兩個專案其中一個需求測試一下快取機制下的執行效率,結果配了半天,老是不起作用,而另一套同樣機制下的應用,確起作用查了兩個系統的配置也一樣,下面是我ehcache.xml 檔案的資訊<?xml version="1.0" encoding="UTF-8"?>
hibernate快取機制簡述
快取的作用主要用來提高效能,可以簡單地理解成一個Map。使用快取涉及到三個操作:把資料放入快取(put)、從快取中獲取資料(get)、刪除快取中的無效資料(remove)。 一級快取,Session級共享(生命週期很短,一般在一個Http請求內): save
hibernate 快取機制
一級快取 1、當session的save()方法持久化一個customer物件時,customer物件被載入到session的快取中,以後即使應用程式中的引用變數不再引用customer物件,只要session的快取還沒有被清空,customer物件仍然處於生命週期中。 2
Hibernate快取原理與策略
Hibernate快取原理 對於Hibernate這類ORM而言,快取顯的尤為重要,它是持久層效能提升的關鍵.簡單來講Hibernate就是對JDBC進行封裝,以實現內部狀態的管理,OR關係的對映等,但隨之帶來的就是資料訪問效率的降低,和效能的下降,而快取就是彌
Hibernate 快取 之 Session 實現(一)
首先以查詢學生為例,模擬一個快取的機制 public class Test { public static void main(String[] args) throws Exception { MyClassDao myClassDao = new
hibernate快取技術詳解
Cache就是快取,它往往是提高系統性能的最重要手段,對資料起到一個蓄水池和緩衝的作用。Cache對於大量依賴資料讀取操作的系統而言尤其重要。在大併發量的情況下,如果每次程式都需要向資料庫直接做查詢操作,它們所帶來的效能開銷顯而易見,頻繁的網路傳輸、資料庫磁碟的讀寫操作都會
Hibernate 快取
1. Cache簡介: 快取(Cache )是計算機領域非常通用的概念。它介於應用程式和永久性資料儲存源(如硬碟上的檔案或者資料庫)之間,其作用是降低應用程式直接讀寫永久性資料儲存源的頻 率,從而提高應用的執行效能。快取中的資料是資料儲存源中資料的拷貝,應用程式在執行
Hibernate旅程(八)Hibernate快取機制--二級快取
Hibernate二級級快取 上篇介紹了一級快取,主要是session快取,session生命週期結束,快取也就結束。二級快取相對於一級快取來說是一個範圍更廣闊一些,就比你住的地方周圍有多個小賣鋪(session快取),和一個大型超市,原料加工廠送貨的時候送小賣鋪一份的同時,必然送一份到超市。而給第二個小
SSH進階(8)——對Hibernate快取的理解
什麼是Hibernate快取? Hibernate是一個持久層框架,同時是ORM原理的體現,快取的概念很重要。概括的說,Hibernate是對JDBC的進一步封裝,以實現內部狀態的一
hibernate快取機制-簡述
hibernate作為orm最優秀的框架之一,它的快取也是非常優秀的,比起其他orm框架,hibernate的快取機制顯得很複雜,如果長時間不使用,又忘記了,提到hibernate,我就只能想起hib
Hibernate快取體系之查詢快取(query cache),以及list和iterate方法的區別
Hibernate框架提供了Session.load()和Session.get()方法,用來根據實體物件的主鍵值從資料庫中查詢對應記錄。針對load和get方法,hibernate提供了一級快取和二級快取的支援,提高查詢效率,具體可以參考我的部落格:通過測試
Hibernate快取管理
1.二級快取配置: 2. 3.1、首先要開啟二級快取,在hibernate.cfg.xml中新增如下配置: 4.<property name="hibernate.cache.u
Hibernate快取簡介及領域物件的三種狀態
1. Session級別的快取又叫做一級快取;SessionFactory級別的快取叫做二級快取。 2.理解Session的快取: •當Session的save()方法持久化一個Customer物件時,Customer物件被加入到Session的快取中,以後即使應用程式中
Hibernate快取非常煩人,想要最新資料連session.clear都不好使
一、hibernate一級快取 (1)hibernate支援兩個級別的快取,預設只支援一級快取; (2)每個Session內部自帶一個一級快取; (3)某個Session被關閉時,其對應的一級快取自動清除; (4)save、update、saveOrup