亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

緩存概念

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

緩存的物理介質通常是內存,而永久性數(shù)據(jù)存儲源的物理介質通常是硬盤或磁盤,應用程序讀寫內存的速度顯然比讀寫硬盤的速度快。如果緩存存放的數(shù)據(jù)非常大,也會用硬盤作為緩存的物理介質。

Hibernate緩存分類

在hibernate中提供了二種緩存機制:一級緩存、二級緩存,因為二級緩存策略是針對于ID查詢的緩存策略,對于條件查詢則毫無作用,為此,Hibernate提供了針對條件查詢的Query Cache(查詢緩存)

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

2、二級緩存。sessionFactory分為內置緩存和外置緩存。

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

     外置緩存是一個可配置的緩存插件,默認sessionFactory不會啟用這個緩存插件,外置緩存中的數(shù)據(jù)就是數(shù)據(jù)庫數(shù)據(jù)的復制。SessionFactory的外置緩存稱為hibernate的二級緩存

     二級緩存由sessionFactory負責管理,SessionFactory的生命周期和應用程序的整個進程對應。二級緩存是可選的,可以在每個類或者每個集合的粒度上配置

3、查詢緩存 它是Hibernate為查詢結果提供的,依賴于二級緩存。

緩存的作用范圍

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

Hibernate 一級緩存

Session內的緩存即一級緩存。位于緩存中的對象稱為持久化對象,它和數(shù)據(jù)庫中的相關記錄對應。Session能夠在某些時間點(session.flush(); ,tx.commit(); ),按照緩存中對象的變化來執(zhí)行相關的SQL語句,從而同步更新數(shù)據(jù)庫,這一過程稱為刷新緩存。

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

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

  1. 減少訪問數(shù)據(jù)庫的頻率
  2. 保證數(shù)據(jù)庫中的相關記錄和緩存中的相應對象同步

session緩存管理方法

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

ps: flush()強制進行從緩存到數(shù)據(jù)庫的同步

Hibernate 二級緩存

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

二級緩存是可配置的插件,Hibernate打包了一些開源緩存實現(xiàn),提供對他們的內置支持

緩存插件 緩存實現(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)。

配置二級緩存的步驟如下:

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

以EHCache配置為例,步驟如下

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

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

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

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

2、開啟二級緩存,在hibernate.cfg.xml配置

<!-- 開啟二級緩存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>

3、指定緩存產品提供商

<!-- 指定緩存產品提供商 -->
<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 的屬性

  • usage 是必須的,指定并發(fā)訪問策略,取值為 transactional(事物緩存),read-write(讀/寫緩存),nonstrict-read-wirte(非嚴格讀/寫緩存),或read-only(只讀緩存)。
  • region 可選,默認為類或集合的名字
  • include 可選,取值為non-lazy(當緩存一個對象時,不會緩存它的映射為延遲加載的屬性)、all,默認值為all

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

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

關閉二級緩存交互

有時候考慮到內存開銷問題,需要關閉與二級緩存的交互,可以調用session的' setCacheMode(CacheMode.IGNORE)方法關閉與二級緩存的交互;

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

二級緩存使用場景

二級緩存并非適合所有場景,使用不當,反而會降低性能。符合如下條件就適合放入二級緩存

  1. 很少修改的數(shù)據(jù)
  2. 不是很關鍵的數(shù)據(jù),能容忍短時間內督導過期數(shù)據(jù)
  3. 應用參考的常量數(shù)據(jù)。它的實例數(shù)目有限,實例會被許多其他類的實例引用,實例極少或從來不被修改

二級緩存不適用場景

  1. 經常修改的數(shù)據(jù)
  2. 財務數(shù)據(jù),絕對不允許讀到過期數(shù)據(jù)
  3. 與其他應用共享的數(shù)據(jù)。如果其他應用修改了數(shù)據(jù)庫中的數(shù)據(jù),Hibernate無法自動保證二級緩存的數(shù)據(jù)與數(shù)據(jù)庫一致

如果不設置“查詢緩存”,那么hibernate只會緩存單個持久化對象,如果想緩存使用 findall() 、list()Iterator() 、createCriteria()createQuery()等方法獲得的數(shù)據(jù)結果集的話, 就需要在配置文件中設置 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);

查詢緩存的使用場景

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

Hibernate性能優(yōu)化

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

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

HQL優(yōu)化

HQL優(yōu)化hibernate程序性能優(yōu)化的一個方面,HQL的語法和SQL非常類似。HQL是基于SQL的,只是增加了面向對象的封裝,如果拋開HQL通Hibernate本身一些緩存機制的關聯(lián),HQL的優(yōu)化技巧通SQL的優(yōu)化技巧一樣,在編寫HQL時,需要主要以下幾個原則

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

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

       只要對該字段進行計算,該字段的索引將不起作用。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關文章

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

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

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

    Java?OkHttp框架源碼超詳細解析

    okhttp是一個第三方類庫,用于android中請求網絡。這是一個開源項目,是安卓端最火熱的輕量級框架,由移動支付Square公司貢獻(該公司還貢獻了Picasso和LeakCanary)?。用于替代HttpUrlConnection和Apache?HttpClient
    2022-11-11
  • java正則表達式應用的實例代碼

    java正則表達式應用的實例代碼

    java正則的實例應用分析,大家從下面的代碼中,就能知道java正則的應用與寫法
    2008-10-10
  • JAXB命名空間_動力節(jié)點Java學院整理

    JAXB命名空間_動力節(jié)點Java學院整理

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

    在IntelliJ IDEA中為自己設計的類庫生成JavaDoc的方法示例

    這篇文章主要介紹了在IntelliJ IDEA中為自己設計的類庫生成JavaDoc的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Mybatis-Plus BaseMapper的用法詳解

    Mybatis-Plus BaseMapper的用法詳解

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

    Java如何實現(xiàn)自定義異常類

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

    Springboot 使用 JSR 303 對 Controller 控制層校驗及 Service 服務層 AOP 校驗

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

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

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

    Java實現(xiàn)一個簡單的線程池代碼示例

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

最新評論