您好,登錄后才能下訂單哦!
緩存概念
緩存 介于應(yīng)用程序和永久性數(shù)據(jù)源(文件,數(shù)據(jù)庫等)之間,作用就是降低應(yīng)用程序直接讀取數(shù)據(jù)源的頻率,從而提高應(yīng)用程序的運行性能。緩存中的數(shù)據(jù)就是數(shù)據(jù)源中數(shù)據(jù)的復(fù)制,應(yīng)用程序在運行時直接讀取緩存中的數(shù)據(jù)。
緩存的物理介質(zhì)通常是內(nèi)存,而永久性數(shù)據(jù)存儲源的物理介質(zhì)通常是硬盤或磁盤,應(yīng)用程序讀寫內(nèi)存的速度顯然比讀寫硬盤的速度快。如果緩存存放的數(shù)據(jù)非常大,也會用硬盤作為緩存的物理介質(zhì)。
Hibernate緩存分類
在hibernate中提供了二種緩存機(jī)制:一級緩存、二級緩存,因為二級緩存策略是針對于ID查詢的緩存策略,對于條件查詢則毫無作用,為此,Hibernate提供了針對條件查詢的Query Cache(查詢緩存)
1、一級緩存。session緩存就是一級緩存。由于session對象的生命周期通常對應(yīng)一個數(shù)據(jù)庫事物,因此他的緩存范圍是事物范圍的緩存。一級緩存是必需的,在一級緩存中,持久化類的每個實例都具有唯一的OID;
2、二級緩存。sessionFactory分為內(nèi)置緩存和外置緩存。
內(nèi)置緩存是hibernate自帶的,不可拆卸,是只讀緩存,用來存放映射元數(shù)據(jù)和預(yù)定義SQL語句。
外置緩存是一個可配置的緩存插件,默認(rèn)sessionFactory不會啟用這個緩存插件,外置緩存中的數(shù)據(jù)就是數(shù)據(jù)庫數(shù)據(jù)的復(fù)制。SessionFactory的外置緩存稱為hibernate的二級緩存
二級緩存由sessionFactory負(fù)責(zé)管理,SessionFactory的生命周期和應(yīng)用程序的整個進(jìn)程對應(yīng)。二級緩存是可選的,可以在每個類或者每個集合的粒度上配置
3、查詢緩存 它是Hibernate為查詢結(jié)果提供的,依賴于二級緩存。
緩存的作用范圍
Hibernate 一級緩存
Session內(nèi)的緩存即一級緩存。位于緩存中的對象稱為持久化對象,它和數(shù)據(jù)庫中的相關(guān)記錄對應(yīng)。Session能夠在某些時間點(session.flush();
,tx.commit();
),按照緩存中對象的變化來執(zhí)行相關(guān)的SQL語句,從而同步更新數(shù)據(jù)庫,這一過程稱為刷新緩存。
當(dāng)應(yīng)用程序調(diào)用 session的 ‘save()
,update()
,saveOrUpdate()
,load()
,get()
'等方法,以及調(diào)用Query查詢接口的' getResultList()
'時,如果在'Session'緩存中還不存在相應(yīng)的對象,Hibernate就會把該對象加入到緩存中,在刷新緩存時,Hibernate會根據(jù)緩存中對象的狀態(tài)變化來同步更新數(shù)據(jù)庫。
綜上所述,Session緩存有兩大作用:
session緩存管理方法
evict();
從session緩存中清除某個對象clear();
清空session緩存ps: flush()
強(qiáng)制進(jìn)行從緩存到數(shù)據(jù)庫的同步
Hibernate 二級緩存
二級緩存是進(jìn)程或集群范圍內(nèi)的緩存,可以被所有的Session共享,其生命周期和SessionFactory一樣。
二級緩存是可配置的插件,Hibernate打包了一些開源緩存實現(xiàn),提供對他們的內(nèi)置支持
緩存插件 | 緩存實現(xiàn)類 | 查詢緩存 |
---|---|---|
EHCache | org.hibernate.cache.EhCacheProvider | 支持 |
OSCache | org.hibernate.cache.OSCacheProvider | 支持 |
SwarmCache | org.hibernate.cache.SwarmCacheProvider | 不支持 |
JBossCache | org.hibernate.cache.TreeCacheProvider | 支持 |
為了把上邊的緩存插件集成到Hibernate中,Hibernate提供了CacheProvider接口,它是緩存插件與Hibernate之間的適配器。
表格中的實現(xiàn)類是CacheProvider接口的不同實現(xiàn)。
配置二級緩存的步驟如下:
以EHCache配置為例,步驟如下
1、將ehcache.xml文件添加到類路徑下
在路徑'hibernate-release-5.2.6.Final\project\etc\'下復(fù)制'ehcache.xml'
標(biāo)簽為每個需要二級緩存的類和集合設(shè)定緩存的數(shù)據(jù)過期策略,配置如下
<cache name="sampleCache1" -- 緩存的名稱,取值為類的完整名稱或類的集合名稱 maxElementsInMemory="10000" -- 基于緩存可存放的對象的最大數(shù)目 eternal="false" -- 如果為true,表示對象永不過期,默認(rèn)為false timeToIdleSeconds="300" -- 設(shè)置允許對象處于空閑狀態(tài)的最長時間,單位是秒 timeToLiveSeconds="600" -- 設(shè)置對象允許存在于緩存中最長時間,單位是秒 overflowToDisk="true" -- 是否將溢出的對象寫到基于硬盤的緩存中 />
2、開啟二級緩存,在hibernate.cfg.xml配置
<!-- 開啟二級緩存 --> <property name="hibernate.cache.use_second_level_cache">true</property>
3、指定緩存產(chǎn)品提供商
<!-- 指定緩存產(chǎn)品提供商 --> <property name="hibernate.cache.provider_class"> <!-- net.sf.ehcache.hibernate.EhCacheProvider --> org.hibernate.cache.EhCacheProvider </property> <property name="cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
4、指定使用二級緩存的持久化類。修改持久化類的映射文件,為元素添加元素,配置如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping> <class name= "com.ytzl.demo.entity.Dept" table ="dept" dynamic-update="true" > <cache usage="read-write"/> <id name="id" column="d_id" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="name" column="d_name" type="java.lang.String"></property> </class> </hibernate-mapping>
cache 的屬性
或者在 hibernate.cfg.xml 的mapping元素后面統(tǒng)一配置 (推薦)
<class-cache usage="read-write" class="com.ytzl.demo.entity.Dept"/>
關(guān)閉二級緩存交互
有時候考慮到內(nèi)存開銷問題,需要關(guān)閉與二級緩存的交互,可以調(diào)用session的' setCacheMode(CacheMode.IGNORE)
方法關(guān)閉與二級緩存的交互;
CacheMode.IGNORE
參數(shù)的意思是當(dāng)前session和二級緩存不再相互作用
二級緩存使用場景
二級緩存并非適合所有場景,使用不當(dāng),反而會降低性能。符合如下條件就適合放入二級緩存
二級緩存不適用場景
如果不設(shè)置“查詢緩存”,那么hibernate只會緩存單個持久化對象,如果想緩存使用 findall()
、list()
、Iterator()
、createCriteria()
、createQuery()
等方法獲得的數(shù)據(jù)結(jié)果集的話, 就需要在配置文件中設(shè)置 hibernate.cache.use_query_cache true
才行
Hibernate查詢緩存
上面說到的二級查詢,只有在基于id查找對象時才會用到,對于查詢則毫無用處。為此,Hibernate提供了針對的查詢的查詢緩存。
查詢緩存依賴于二級緩存,因此使用查詢緩存之前要按步驟配置好二級緩存
使用查詢緩存的步驟如下
1、在hibernate.cfg.xml中開啟查詢緩存
<!-- 查詢緩存 --> <property name="hibernate.cache.use_query_cache">true</property>
2、在程序中啟用查詢緩存
query.setCacheable(true);
查詢緩存的使用場景
Hibernate性能優(yōu)化
Hibernate主要從一下幾個方面來優(yōu)化查詢性能
iterate()
方法減少select語句中的字段,從而降低訪問數(shù)據(jù)庫的數(shù)據(jù)量HQL優(yōu)化
HQL優(yōu)化hibernate程序性能優(yōu)化的一個方面,HQL的語法和SQL非常類似。HQL是基于SQL的,只是增加了面向?qū)ο蟮姆庋b,如果拋開HQL通Hibernate本身一些緩存機(jī)制的關(guān)聯(lián),HQL的優(yōu)化技巧通SQL的優(yōu)化技巧一樣,在編寫HQL時,需要主要以下幾個原則
只要對字段使用函數(shù),該字段的索引將不起作用。
只要對該字段進(jìn)行計算,該字段的索引將不起作用。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。