更新時(shí)間:2022-02-11 10:56:06 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽995次
緩存是一種提高系統(tǒng)性能的機(jī)制。它是位于應(yīng)用程序和數(shù)據(jù)庫(kù)之間的緩沖存儲(chǔ)器。高速緩存存儲(chǔ)最近使用的數(shù)據(jù)項(xiàng),以盡可能減少數(shù)據(jù)庫(kù)命中的次數(shù)。
緩存對(duì) Hibernate 也很重要。它使用多級(jí)緩存方案,如下所述

一級(jí)緩存是Session緩存,是所有請(qǐng)求都必須通過(guò)的強(qiáng)制緩存。Session 對(duì)象在將對(duì)象提交到數(shù)據(jù)庫(kù)之前將其保持在自己的權(quán)力之下。
如果您對(duì)一個(gè)對(duì)象發(fā)出多個(gè)更新,Hibernate 會(huì)嘗試盡可能長(zhǎng)時(shí)間地延遲執(zhí)行更新,以減少發(fā)出的更新 SQL 語(yǔ)句的數(shù)量。如果您關(guān)閉會(huì)話,所有正在緩存的對(duì)象都將丟失,并在數(shù)據(jù)庫(kù)中保留或更新。
二級(jí)緩存是可選的緩存,在嘗試定位二級(jí)緩存中的對(duì)象之前,將始終參考一級(jí)緩存。二級(jí)緩存可以基于每個(gè)類(lèi)和每個(gè)集合進(jìn)行配置,主要負(fù)責(zé)跨會(huì)話緩存對(duì)象。
任何第三方緩存都可以與 Hibernate 一起使用。提供了一個(gè)org.hibernate.cache.CacheProvider接口,必須實(shí)現(xiàn)該接口才能為 Hibernate 提供緩存實(shí)現(xiàn)的句柄。
Hibernate 還實(shí)現(xiàn)了與二級(jí)緩存緊密集成的查詢結(jié)果集緩存。
這是一個(gè)可選功能,需要兩個(gè)額外的物理緩存區(qū)域來(lái)保存緩存的查詢結(jié)果和上次更新表時(shí)的時(shí)間戳。這僅對(duì)使用相同參數(shù)頻繁運(yùn)行的查詢有用。
Hibernate默認(rèn)使用一級(jí)緩存,你不用做一級(jí)緩存。讓我們直接進(jìn)入可選的二級(jí)緩存。并非所有類(lèi)都能從緩存中受益,因此能夠禁用二級(jí)緩存很重要。
Hibernate 二級(jí)緩存分兩步設(shè)置。首先,您必須決定使用哪種并發(fā)策略。之后,您可以使用緩存提供程序配置緩存過(guò)期和物理緩存屬性。
并發(fā)策略是一個(gè)中介,它負(fù)責(zé)將數(shù)據(jù)項(xiàng)存儲(chǔ)在緩存中并從緩存中檢索它們。如果要啟用二級(jí)緩存,則必須為每個(gè)持久類(lèi)和集合決定使用哪種緩存并發(fā)策略。
Transactional - 將此策略用于以讀取為主的數(shù)據(jù),在這種情況下,在極少數(shù)更新的情況下,防止并發(fā)事務(wù)中的陳舊數(shù)據(jù)至關(guān)重要。
Read-write - 再次將此策略用于以讀取為主的數(shù)據(jù),在這種情況下,在極少數(shù)更新的情況下,防止并發(fā)事務(wù)中的陳舊數(shù)據(jù)至關(guān)重要。
Nonstrict-read-write - 此策略無(wú)法保證緩存和數(shù)據(jù)庫(kù)之間的一致性。如果數(shù)據(jù)幾乎從未更改并且過(guò)時(shí)數(shù)據(jù)的可能性很小不是關(guān)鍵問(wèn)題,則使用此策略。
只讀- 適用于數(shù)據(jù)的并發(fā)策略,永遠(yuǎn)不會(huì)改變。僅將其用作參考數(shù)據(jù)。
如果我們要為Employee類(lèi)使用二級(jí)緩存,讓我們添加所需的映射元素,告訴 Hibernate 使用讀寫(xiě)策略緩存 Employee 實(shí)例。
<?xml version = "1.0" encoding = "utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name = "Employee" table = "EMPLOYEE">
<meta attribute = "class-description">
This class contains the employee detail.
</meta>
<cache usage = "read-write"/>
<id name = "id" type = "int" column = "id">
<generator class="native"/>
</id>
<property name = "firstName" column = "first_name" type = "string"/>
<property name = "lastName" column = "last_name" type = "string"/>
<property name = "salary" column = "salary" type = "int"/>
</class>
</hibernate-mapping>
usage="read-write" 屬性告訴 Hibernate 對(duì)定義的緩存使用讀寫(xiě)并發(fā)策略。
要使用查詢緩存,您必須首先使用配置文件中的hibernate.cache.use_query_cache="true"屬性激活它。通過(guò)將此屬性設(shè)置為 true,您可以讓 Hibernate 在內(nèi)存中創(chuàng)建必要的緩存來(lái)保存查詢和標(biāo)識(shí)符集。
接下來(lái),要使用查詢緩存,請(qǐng)使用 Query 類(lèi)的 setCacheable(Boolean) 方法。例如
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
List users = query.list();
SessionFactory.closeSession();
Hibernate 還通過(guò)緩存區(qū)域的概念支持非常細(xì)粒度的緩存支持。緩存區(qū)域是指定名稱的緩存的一部分。
Session session = SessionFactory.openSession();
Query query = session.createQuery("FROM EMPLOYEE");
query.setCacheable(true);
query.setCacheRegion("employee");
List users = query.list();
SessionFactory.closeSession();
此代碼使用該方法告訴 Hibernate 在緩存的員工區(qū)域中存儲(chǔ)和查找查詢。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)