最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解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ì)通常是硬盤或磁盤,應(yīng)用程序讀寫內(nèi)存的速度顯然比讀寫硬盤的速度快。如果緩存存放的數(shù)據(jù)非常大,也會(huì)用硬盤作為緩存的物理介質(zhì)。

Hibernate緩存分類

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

1、一級(jí)緩存。session緩存就是一級(jí)緩存。由于session對(duì)象的生命周期通常對(duì)應(yīng)一個(gè)數(shù)據(jù)庫(kù)事物,因此他的緩存范圍是事物范圍的緩存。一級(jí)緩存是必需的,在一級(jí)緩存中,持久化類的每個(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的外置緩存稱為hibernate的二級(jí)緩存

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

3、查詢緩存 它是Hibernate為查詢結(jié)果提供的,依賴于二級(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ì)象稱為持久化對(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ò)程稱為刷新緩存。

當(dāng)應(yīng)用程序調(diào)用 session的 ‘save() ,update() ,saveOrUpdate() ,load() ,get()'等方法,以及調(diào)用Query查詢接口的' 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)類 查詢緩存
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)類是CacheProvider接口的不同實(shí)現(xiàn)。

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

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

以EHCache配置為例,步驟如下

1、將ehcache.xml文件添加到類路徑下

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

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

<cache name="sampleCache1"  -- 緩存的名稱,取值為類的完整名稱或類的集合名稱
 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ì)象寫到基于硬盤的緩存中
 />

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í)緩存的持久化類。修改持久化類的映射文件,為元素添加元素,配置如下:

<?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ā)訪問(wèn)策略,取值為 transactional(事物緩存),read-write(讀/寫緩存),nonstrict-read-wirte(非嚴(yán)格讀/寫緩存),或read-only(只讀緩存)。
  • region 可選,默認(rèn)為類或集合的名字
  • 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)銷問(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ì)被許多其他類的實(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è)置“查詢緩存”,那么hibernate只會(huì)緩存單個(gè)持久化對(duì)象,如果想緩存使用 findall() 、list() 、Iterator()createCriteria() 、createQuery()等方法獲得的數(shù)據(jù)結(jié)果集的話, 就需要在配置文件中設(shè)置 hibernate.cache.use_query_cache true 才行

Hibernate查詢緩存

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

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

使用查詢緩存的步驟如下

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

<!-- 查詢緩存 -->
<property name="hibernate.cache.use_query_cache">true</property>

2、在程序中啟用查詢緩存

query.setCacheable(true);

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

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

Hibernate性能優(yōu)化

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

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

HQL優(yōu)化

HQL優(yōu)化hibernate程序性能優(yōu)化的一個(gè)方面,HQL的語(yǔ)法和SQL非常類似。HQL是基于SQL的,只是增加了面向?qū)ο蟮姆庋b,如果拋開(kāi)HQL通Hibernate本身一些緩存機(jī)制的關(guān)聯(lián),HQL的優(yōu)化技巧通SQL的優(yōu)化技巧一樣,在編寫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子句。在分組查詢中,可在兩個(gè)位置指定條件,一是where子句中,二是having子句中。盡可能的在where子句而不是在having子句中指定條件。having是在檢索出所有記錄后對(duì)結(jié)果集進(jìn)行過(guò)濾。這個(gè)處理需要一定的開(kāi)銷,而where子句限制記錄數(shù)目,能減少這方面的開(kāi)銷
  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)文章

  • 淺談MyBatis 事務(wù)管理

    淺談MyBatis 事務(wù)管理

    這篇文章主要介紹了淺談MyBatis 事務(wù)管理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • SpringBoot項(xiàng)目啟動(dòng)后自動(dòng)加載系統(tǒng)配置的多種實(shí)現(xiàn)方式

    SpringBoot項(xiàng)目啟動(dòng)后自動(dòng)加載系統(tǒng)配置的多種實(shí)現(xiàn)方式

    這篇文章主要介紹了SpringBoot項(xiàng)目啟動(dòng)后自動(dòng)加載系統(tǒng)配置的多種實(shí)現(xiàn)方式,并通過(guò)代碼示例講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2025-01-01
  • Java實(shí)現(xiàn)斗地主小游戲

    Java實(shí)現(xiàn)斗地主小游戲

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)斗地主小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • mybatis項(xiàng)目CRUD步驟實(shí)例詳解

    mybatis項(xiàng)目CRUD步驟實(shí)例詳解

    這篇文章主要介紹了mybatis項(xiàng)目CRUD步驟,包括pom.xml引入相應(yīng)的依賴,在resources目錄下寫配置文件,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Java基于遞歸和循環(huán)兩種方式實(shí)現(xiàn)未知維度集合的笛卡爾積算法示例

    Java基于遞歸和循環(huán)兩種方式實(shí)現(xiàn)未知維度集合的笛卡爾積算法示例

    這篇文章主要介紹了Java基于遞歸和循環(huán)兩種方式實(shí)現(xiàn)未知維度集合的笛卡爾積算法,結(jié)合實(shí)例形式分析了Java使用遞歸與循環(huán)兩種方式實(shí)現(xiàn)未知維度集合的笛卡爾積相關(guān)概念、原理與操作技巧,需要的朋友可以參考下
    2017-12-12
  • java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式

    java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式

    這篇文章主要介紹了java編譯后的文件出現(xiàn)xx$1.class的原因及解決方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • Spring Cloud中關(guān)于Feign的常見(jiàn)問(wèn)題總結(jié)

    Spring Cloud中關(guān)于Feign的常見(jiàn)問(wèn)題總結(jié)

    這篇文章主要給大家介紹了Spring Cloud中關(guān)于Feign的常見(jiàn)問(wèn)題,文中通過(guò)示例代碼介紹的很詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-02-02
  • 深入淺出探索Java分布式鎖原理

    深入淺出探索Java分布式鎖原理

    單體系統(tǒng)中,在高并發(fā)場(chǎng)景下想要訪問(wèn)共享資源的時(shí)候,我們需要通過(guò)加鎖的方式來(lái)保證共享資源并發(fā)的安全性,確保在同一時(shí)刻只有一個(gè)線程對(duì)共享資源進(jìn)行操作
    2022-02-02
  • Java中的ThreadLocal源碼及弱引用解析

    Java中的ThreadLocal源碼及弱引用解析

    這篇文章主要介紹了Java中的ThreadLocal源碼及弱引用解析,ThreadLocal類通過(guò)ThreadLocal可以實(shí)現(xiàn)全局變量在多線程環(huán)境下的線程隔離,每個(gè)線程都可以獨(dú)立地訪問(wèn)和修改自己的全局變量副本,不會(huì)影響其他線程的副本,需要的朋友可以參考下
    2024-01-01
  • mybatis-plus數(shù)據(jù)權(quán)限實(shí)現(xiàn)代碼

    mybatis-plus數(shù)據(jù)權(quán)限實(shí)現(xiàn)代碼

    這篇文章主要介紹了mybatis-plus數(shù)據(jù)權(quán)限實(shí)現(xiàn),結(jié)合了mybatis-plus的插件方式,做出了自己的注解方式的數(shù)據(jù)權(quán)限,雖然可能存在一部分的局限性,但很好的解決了我們自己去解析SQL的功能,需要的朋友可以參考下
    2023-06-06

最新評(píng)論

毕节市| 南平市| 佛山市| 镶黄旗| 罗江县| 滨海县| 巢湖市| 建瓯市| 梅河口市| 天全县| 呈贡县| 资阳市| 谷城县| 蒙阴县| 锡林郭勒盟| 肇州县| 峨边| 永昌县| 融水| 旺苍县| 广丰县| 泰顺县| 朝阳县| 车致| 玉林市| 高邮市| 泸西县| 平和县| 集贤县| 永川市| 邹城市| 沙雅县| 郓城县| 斗六市| 江山市| 重庆市| 富锦市| 驻马店市| 阜康市| 息烽县| 镇宁|