詳解Hibernate緩存與性能優(yōu)化-創(chuàng)新互聯(lián)

創(chuàng)新互聯(lián)www.cdcxhl.cn八線動(dòng)態(tài)BGP香港云服務(wù)器提供商,新人活動(dòng)買(mǎi)多久送多久,劃算不套路!

創(chuàng)新互聯(lián)專(zhuān)業(yè)為企業(yè)提供鐘山網(wǎng)站建設(shè)、鐘山做網(wǎng)站、鐘山網(wǎng)站設(shè)計(jì)、鐘山網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、鐘山企業(yè)網(wǎng)站模板建站服務(wù),十年鐘山做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

緩存概念

緩存 介于應(yīng)用程序和永久性數(shù)據(jù)源(文件,數(shù)據(jù)庫(kù)等)之間,作用就是降低應(yīng)用程序直接讀取數(shù)據(jù)源的頻率,從而提高應(yīng)用程序的運(yùn)行性能。緩存中的數(shù)據(jù)就是數(shù)據(jù)源中數(shù)據(jù)的復(fù)制,應(yīng)用程序在運(yùn)行時(shí)直接讀取緩存中的數(shù)據(jù)。

緩存的物理介質(zhì)通常是內(nèi)存,而永久性數(shù)據(jù)存儲(chǔ)源的物理介質(zhì)通常是硬盤(pán)或磁盤(pán),應(yīng)用程序讀寫(xiě)內(nèi)存的速度顯然比讀寫(xiě)硬盤(pán)的速度快。如果緩存存放的數(shù)據(jù)非常大,也會(huì)用硬盤(pán)作為緩存的物理介質(zhì)。

Hibernate緩存分類(lèi)

在hibernate中提供了二種緩存機(jī)制:一級(jí)緩存、二級(jí)緩存,因?yàn)槎?jí)緩存策略是針對(duì)于ID查詢(xún)的緩存策略,對(duì)于條件查詢(xún)則毫無(wú)作用,為此,Hibernate提供了針對(duì)條件查詢(xún)的Query Cache(查詢(xún)緩存)

1、一級(jí)緩存。session緩存就是一級(jí)緩存。由于session對(duì)象的生命周期通常對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)事物,因此他的緩存范圍是事物范圍的緩存。一級(jí)緩存是必需的,在一級(jí)緩存中,持久化類(lèi)的每個(gè)實(shí)例都具有唯一的OID;

2、二級(jí)緩存。sessionFactory分為內(nèi)置緩存和外置緩存。

     內(nèi)置緩存是hibernate自帶的,不可拆卸,是只讀緩存,用來(lái)存放映射元數(shù)據(jù)和預(yù)定義SQL語(yǔ)句。

     外置緩存是一個(gè)可配置的緩存插件,默認(rèn)sessionFactory不會(huì)啟用這個(gè)緩存插件,外置緩存中的數(shù)據(jù)就是數(shù)據(jù)庫(kù)數(shù)據(jù)的復(fù)制。SessionFactory的外置緩存稱(chēng)為hibernate的二級(jí)緩存

     二級(jí)緩存由sessionFactory負(fù)責(zé)管理,SessionFactory的生命周期和應(yīng)用程序的整個(gè)進(jìn)程對(duì)應(yīng)。二級(jí)緩存是可選的,可以在每個(gè)類(lèi)或者每個(gè)集合的粒度上配置

3、查詢(xún)緩存 它是Hibernate為查詢(xún)結(jié)果提供的,依賴(lài)于二級(jí)緩存。

緩存的作用范圍

  1. 事物范圍 每個(gè)事物都有自己的緩存,緩存內(nèi)數(shù)據(jù)不會(huì)被多個(gè)事物并發(fā)訪問(wèn)。例如,Hibernate的一級(jí)緩存,事物是不能跨多個(gè)Session的,Session內(nèi)數(shù)據(jù)只能被當(dāng)前事物訪問(wèn),因此它屬于事物范圍內(nèi)的緩存。
  2. 進(jìn)程范圍 進(jìn)程內(nèi)的所有事物共享緩存,進(jìn)程結(jié)束,緩存結(jié)束生命周期。例如,Hibernate的二級(jí)緩存,SessionFactory對(duì)象的生命周期對(duì)應(yīng)應(yīng)用程序的整個(gè)進(jìn)程,因此它屬于進(jìn)程范圍的緩存。
  3. 集群范圍 緩存被一個(gè)或多個(gè)機(jī)器上的進(jìn)程共享。hibernate的二級(jí)緩存也可以作為集群范圍的緩存。

Hibernate 一級(jí)緩存

Session內(nèi)的緩存即一級(jí)緩存。位于緩存中的對(duì)象稱(chēng)為持久化對(duì)象,它和數(shù)據(jù)庫(kù)中的相關(guān)記錄對(duì)應(yīng)。Session能夠在某些時(shí)間點(diǎn)(session.flush(); ,tx.commit(); ),按照緩存中對(duì)象的變化來(lái)執(zhí)行相關(guān)的SQL語(yǔ)句,從而同步更新數(shù)據(jù)庫(kù),這一過(guò)程稱(chēng)為刷新緩存。

當(dāng)應(yīng)用程序調(diào)用 session的 ‘save() ,update() ,saveOrUpdate() ,load() ,get()'等方法,以及調(diào)用Query查詢(xún)接口的' getResultList()'時(shí),如果在'Session'緩存中還不存在相應(yīng)的對(duì)象,Hibernate就會(huì)把該對(duì)象加入到緩存中,在刷新緩存時(shí),Hibernate會(huì)根據(jù)緩存中對(duì)象的狀態(tài)變化來(lái)同步更新數(shù)據(jù)庫(kù)。

綜上所述,Session緩存有兩大作用:

  1. 減少訪問(wèn)數(shù)據(jù)庫(kù)的頻率
  2. 保證數(shù)據(jù)庫(kù)中的相關(guān)記錄和緩存中的相應(yīng)對(duì)象同步

session緩存管理方法

  1. evict(); 從session緩存中清除某個(gè)對(duì)象
  2. clear(); 清空session緩存

ps: flush()強(qiáng)制進(jìn)行從緩存到數(shù)據(jù)庫(kù)的同步

Hibernate 二級(jí)緩存

二級(jí)緩存是進(jìn)程或集群范圍內(nèi)的緩存,可以被所有的Session共享,其生命周期和SessionFactory一樣。

二級(jí)緩存是可配置的插件,Hibernate打包了一些開(kāi)源緩存實(shí)現(xiàn),提供對(duì)他們的內(nèi)置支持

緩存插件 緩存實(shí)現(xiàn)類(lèi) 查詢(xú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之間的適配器。

表格中的實(shí)現(xiàn)類(lèi)是CacheProvider接口的不同實(shí)現(xiàn)。

配置二級(jí)緩存的步驟如下:

  1. 選擇合適的緩存插件,配置其自帶的配置文件
  2. 選擇需要使用二級(jí)緩存的持久化類(lèi),設(shè)置它的二級(jí)緩存的并發(fā)訪問(wèn)策略。

以EHCache配置為例,步驟如下

1、將ehcache.xml文件添加到類(lèi)路徑下

     在路徑'hibernate-release-5.2.6.Final\project\etc\'下復(fù)制'ehcache.xml'

     標(biāo)簽為每個(gè)需要二級(jí)緩存的類(lèi)和集合設(shè)定緩存的數(shù)據(jù)過(guò)期策略,配置如下

<cache name="sampleCache1"  -- 緩存的名稱(chēng),取值為類(lèi)的完整名稱(chēng)或類(lèi)的集合名稱(chēng)
 maxElementsInMemory="10000" -- 基于緩存可存放的對(duì)象的大數(shù)目
 eternal="false"   -- 如果為true,表示對(duì)象永不過(guò)期,默認(rèn)為false 
 timeToIdleSeconds="300"  -- 設(shè)置允許對(duì)象處于空閑狀態(tài)的最長(zhǎng)時(shí)間,單位是秒
 timeToLiveSeconds="600"  -- 設(shè)置對(duì)象允許存在于緩存中最長(zhǎng)時(shí)間,單位是秒
 overflowToDisk="true"  -- 是否將溢出的對(duì)象寫(xiě)到基于硬盤(pán)的緩存中
 />

本文標(biāo)題:詳解Hibernate緩存與性能優(yōu)化-創(chuàng)新互聯(lián)
當(dāng)前URL:http://muchs.cn/article14/dshide.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、品牌網(wǎng)站建設(shè)、網(wǎng)站策劃、手機(jī)網(wǎng)站建設(shè)、服務(wù)器托管、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司