欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解Hibernate緩存與性能優(yōu)化

 更新時(shí)間:2017年02月27日 09:25:25   作者:孟祥超  
在hibernate中,提到性能優(yōu)化,很自然地我們就想到了緩存。緩存是什么,都有哪些呢?下面這篇文章就主要給大家介紹了關(guān)于Hibernate緩存與性能優(yōu)化的相關(guān)資料,需要的朋友可以參考下。

緩存概念

緩存 介于應(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ā)訪(fǎng)問(wèn)。例如,Hibernate的一級(jí)緩存,事物是不能跨多個(gè)Session的,Session內(nèi)數(shù)據(jù)只能被當(dāng)前事物訪(fǎ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. 減少訪(fǎng)問(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ā)訪(fǎng)問(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)的緩存中
 />

2、開(kāi)啟二級(jí)緩存,在hibernate.cfg.xml配置

<!-- 開(kāi)啟二級(jí)緩存 -->
<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、指定使用二級(jí)緩存的持久化類(lèi)。修改持久化類(lèi)的映射文件,為元素添加元素,配置如下:

<?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 的屬性

  • usage 是必須的,指定并發(fā)訪(fǎng)問(wèn)策略,取值為 transactional(事物緩存),read-write(讀/寫(xiě)緩存),nonstrict-read-wirte(非嚴(yán)格讀/寫(xiě)緩存),或read-only(只讀緩存)。
  • region 可選,默認(rèn)為類(lèi)或集合的名字
  • include 可選,取值為non-lazy(當(dāng)緩存一個(gè)對(duì)象時(shí),不會(huì)緩存它的映射為延遲加載的屬性)、all,默認(rèn)值為all

或者在 hibernate.cfg.xml 的mapping元素后面統(tǒng)一配置 (推薦)

<class-cache usage="read-write" class="com.ytzl.demo.entity.Dept"/>

關(guān)閉二級(jí)緩存交互

有時(shí)候考慮到內(nèi)存開(kāi)銷(xiāo)問(wèn)題,需要關(guān)閉與二級(jí)緩存的交互,可以調(diào)用session的' setCacheMode(CacheMode.IGNORE)方法關(guān)閉與二級(jí)緩存的交互;

CacheMode.IGNORE參數(shù)的意思是當(dāng)前session和二級(jí)緩存不再相互作用

二級(jí)緩存使用場(chǎng)景

二級(jí)緩存并非適合所有場(chǎng)景,使用不當(dāng),反而會(huì)降低性能。符合如下條件就適合放入二級(jí)緩存

  1. 很少修改的數(shù)據(jù)
  2. 不是很關(guān)鍵的數(shù)據(jù),能容忍短時(shí)間內(nèi)督導(dǎo)過(guò)期數(shù)據(jù)
  3. 應(yīng)用參考的常量數(shù)據(jù)。它的實(shí)例數(shù)目有限,實(shí)例會(huì)被許多其他類(lèi)的實(shí)例引用,實(shí)例極少或從來(lái)不被修改

二級(jí)緩存不適用場(chǎng)景

  1. 經(jīng)常修改的數(shù)據(jù)
  2. 財(cái)務(wù)數(shù)據(jù),絕對(duì)不允許讀到過(guò)期數(shù)據(jù)
  3. 與其他應(yīng)用共享的數(shù)據(jù)。如果其他應(yīng)用修改了數(shù)據(jù)庫(kù)中的數(shù)據(jù),Hibernate無(wú)法自動(dòng)保證二級(jí)緩存的數(shù)據(jù)與數(shù)據(jù)庫(kù)一致

如果不設(shè)置“查詢(xún)緩存”,那么hibernate只會(huì)緩存單個(gè)持久化對(duì)象,如果想緩存使用 findall()list() 、Iterator()createCriteria() 、createQuery()等方法獲得的數(shù)據(jù)結(jié)果集的話(huà), 就需要在配置文件中設(shè)置 hibernate.cache.use_query_cache true 才行

Hibernate查詢(xún)緩存

上面說(shuō)到的二級(jí)查詢(xún),只有在基于id查找對(duì)象時(shí)才會(huì)用到,對(duì)于查詢(xún)則毫無(wú)用處。為此,Hibernate提供了針對(duì)的查詢(xún)的查詢(xún)緩存。

查詢(xún)緩存依賴(lài)于二級(jí)緩存,因此使用查詢(xún)緩存之前要按步驟配置好二級(jí)緩存

使用查詢(xún)緩存的步驟如下

1、在hibernate.cfg.xml中開(kāi)啟查詢(xún)緩存

<!-- 查詢(xún)緩存 -->
<property name="hibernate.cache.use_query_cache">true</property>

2、在程序中啟用查詢(xún)緩存

query.setCacheable(true);

查詢(xún)緩存的使用場(chǎng)景

  1. 經(jīng)常使用的查詢(xún)語(yǔ)句
  2. 對(duì)于查詢(xún)的數(shù)據(jù)很少有插入、刪除或者更新操作

Hibernate性能優(yōu)化

Hibernate主要從一下幾個(gè)方面來(lái)優(yōu)化查詢(xún)性能

  1. 使用迫切左外鏈接或迫切內(nèi)鏈接查詢(xún)策略、查詢(xún)緩存等方式,減少select語(yǔ)句的數(shù)目,降低訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的頻率
  2. 使用延遲加載查詢(xún)策略等方式避免加載多余的不需要訪(fǎng)問(wèn)的數(shù)據(jù)
  3. 使用Query接口的iterate()方法減少select語(yǔ)句中的字段,從而降低訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的數(shù)據(jù)量

HQL優(yōu)化

HQL優(yōu)化hibernate程序性能優(yōu)化的一個(gè)方面,HQL的語(yǔ)法和SQL非常類(lèi)似。HQL是基于SQL的,只是增加了面向?qū)ο蟮姆庋b,如果拋開(kāi)HQL通Hibernate本身一些緩存機(jī)制的關(guān)聯(lián),HQL的優(yōu)化技巧通SQL的優(yōu)化技巧一樣,在編寫(xiě)HQL時(shí),需要主要以下幾個(gè)原則

  1. 避免 or操作的使用不當(dāng)。如果where子句中有多個(gè)條件,并且其中某個(gè)條件沒(méi)有索引,使用or,將導(dǎo)致全表掃描。
  2. 避免使用 not 。如果where子句的條件包含not關(guān)鍵字,那么執(zhí)行時(shí)該字段的索引失效。這些需要分成不同情況區(qū)別對(duì)待,對(duì)于 不大于(不多于)、不小于(不少于)建議使用運(yùn)算符來(lái)替代not
  3. 避免like的特殊形式。某些情況下,會(huì)在where子句條件中使用用like。如果like以一個(gè)“%”或“_”開(kāi)始即前模糊,則該字段的索引不起作用。目前沒(méi)有什么解決 辦法。
  4. 避免 having子句。在分組查詢(xún)中,可在兩個(gè)位置指定條件,一是where子句中,二是having子句中。盡可能的在where子句而不是在having子句中指定條件。having是在檢索出所有記錄后對(duì)結(jié)果集進(jìn)行過(guò)濾。這個(gè)處理需要一定的開(kāi)銷(xiāo),而where子句限制記錄數(shù)目,能減少這方面的開(kāi)銷(xiāo)
  5. 避免使用 distinct 。指定distinct會(huì)導(dǎo)致在結(jié)果中刪除重復(fù)的行,這會(huì)對(duì)處理時(shí)間造成一定的影響。
  6. 索引在以下情況失效,應(yīng)注意使用

       只要對(duì)字段使用函數(shù),該字段的索引將不起作用。

       只要對(duì)該字段進(jìn)行計(jì)算,該字段的索引將不起作用。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解

    Java并發(fā)編程之ConcurrentLinkedQueue源碼詳解

    今天帶小伙伴們學(xué)習(xí)一下Java并發(fā)編程之Java ConcurrentLinkedQueue源碼,本篇文章詳細(xì)分析了ConcurrentLinkedQueue源碼,有代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們很有幫助喲,需要的朋友可以參考下
    2021-05-05
  • Java?OkHttp框架源碼超詳細(xì)解析

    Java?OkHttp框架源碼超詳細(xì)解析

    okhttp是一個(gè)第三方類(lèi)庫(kù),用于android中請(qǐng)求網(wǎng)絡(luò)。這是一個(gè)開(kāi)源項(xiàng)目,是安卓端最火熱的輕量級(jí)框架,由移動(dòng)支付Square公司貢獻(xiàn)(該公司還貢獻(xiàn)了Picasso和LeakCanary)?。用于替代HttpUrlConnection和Apache?HttpClient
    2022-11-11
  • java正則表達(dá)式應(yīng)用的實(shí)例代碼

    java正則表達(dá)式應(yīng)用的實(shí)例代碼

    java正則的實(shí)例應(yīng)用分析,大家從下面的代碼中,就能知道java正則的應(yīng)用與寫(xiě)法
    2008-10-10
  • JAXB命名空間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    JAXB命名空間_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了JAXB命名空間的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 在IntelliJ IDEA中為自己設(shè)計(jì)的類(lèi)庫(kù)生成JavaDoc的方法示例

    在IntelliJ IDEA中為自己設(shè)計(jì)的類(lèi)庫(kù)生成JavaDoc的方法示例

    這篇文章主要介紹了在IntelliJ IDEA中為自己設(shè)計(jì)的類(lèi)庫(kù)生成JavaDoc的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Mybatis-Plus BaseMapper的用法詳解

    Mybatis-Plus BaseMapper的用法詳解

    這篇文章主要介紹了Mybatis-Plus BaseMapper的用法詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Java如何實(shí)現(xiàn)自定義異常類(lèi)

    Java如何實(shí)現(xiàn)自定義異常類(lèi)

    這篇文章主要介紹了Java如何實(shí)現(xiàn)自定義異常類(lèi),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-02-02
  • Springboot 使用 JSR 303 對(duì) Controller 控制層校驗(yàn)及 Service 服務(wù)層 AOP 校驗(yàn) 使用消息資源文件對(duì)消息國(guó)際化

    Springboot 使用 JSR 303 對(duì) Controller 控制層校驗(yàn)及 Service 服務(wù)層 AOP 校驗(yàn)

    這篇文章主要介紹了Springboot 使用 JSR 303 對(duì) Controller 控制層校驗(yàn)及 Service 服務(wù)層 AOP 校驗(yàn) 使用消息資源文件對(duì)消息國(guó)際化的相關(guān)知識(shí),需要的朋友可以參考下
    2017-12-12
  • 使用java從亂碼文本中解析出正確的文本

    使用java從亂碼文本中解析出正確的文本

    這篇文章主要介紹了使用java從亂碼文本中解析出正確的文本的方法,需要的朋友可以參考下
    2014-04-04
  • Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)程池代碼示例

    Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)程池代碼示例

    線(xiàn)程池是管理線(xiàn)程的一個(gè)池子,通過(guò)阻塞隊(duì)列管理任務(wù),主要參數(shù)包括corePoolSize、maximumPoolSize、keepAliveTime等,這篇文章主要介紹了Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的線(xiàn)程池的相關(guān)資料,需要的朋友可以參考下
    2024-09-09

最新評(píng)論