国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Hibernate緩存與性能優化

詳解Hibernate緩存與性能優化

2020-08-20 10:55孟祥超 Java教程

在hibernate中,提到性能優化,很自然地我們就想到了緩存。緩存是什么,都有哪些呢?下面這篇文章就主要給大家介紹了關于Hibernate緩存與性能優化的相關資料,需要的朋友可以參考下。

緩存概念

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

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

Hibernate緩存分類

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

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

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

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

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

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

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

緩存的作用范圍

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

Hibernate 一級緩存

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

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

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

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

session緩存管理方法

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

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

Hibernate 二級緩存

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

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

 

緩存插件 緩存實現類 查詢緩存
EHCache org.hibernate.cache.EhCacheProvider 支持
OSCache org.hibernate.cache.OSCacheProvider 支持
SwarmCache org.hibernate.cache.SwarmCacheProvider 不支持
JBossCache org.hibernate.cache.TreeCacheProvider 支持

 

為了把上邊的緩存插件集成到Hibernate中,Hibernate提供了CacheProvider接口,它是緩存插件與Hibernate之間的適配器。

表格中的實現類是CacheProvider接口的不同實現。

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

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

以EHCache配置為例,步驟如下

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

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

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

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

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

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

3、指定緩存產品提供商

?
1
2
3
4
5
6
<!-- 指定緩存產品提供商 -->
<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、指定使用二級緩存的持久化類。修改持久化類的映射文件,為元素添加元素,配置如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?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 是必須的,指定并發訪問策略,取值為 transactional(事物緩存),read-write(讀/寫緩存),nonstrict-read-wirte(非嚴格讀/寫緩存),或read-only(只讀緩存)。
  • region 可選,默認為類或集合的名字
  • include 可選,取值為non-lazy(當緩存一個對象時,不會緩存它的映射為延遲加載的屬性)、all,默認值為all

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

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

關閉二級緩存交互

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

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

二級緩存使用場景

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

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

二級緩存不適用場景

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

如果不設置“查詢緩存”,那么hibernate只會緩存單個持久化對象,如果想緩存使用 findall()list()Iterator()createCriteria()createQuery()等方法獲得的數據結果集的話, 就需要在配置文件中設置 hibernate.cache.use_query_cache true 才行

Hibernate查詢緩存

上面說到的二級查詢,只有在基于id查找對象時才會用到,對于查詢則毫無用處。為此,Hibernate提供了針對的查詢的查詢緩存。

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

使用查詢緩存的步驟如下

1、在hibernate.cfg.xml中開啟查詢緩存

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

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

?
1
query.setCacheable(true);

查詢緩存的使用場景

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

Hibernate性能優化

Hibernate主要從一下幾個方面來優化查詢性能

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

HQL優化

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

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

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

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

總結

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

原文鏈接:https://sky-mxc.github.io/2017/01/15/hibernate-capability-optimize/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲 欧美 日韩 在线 | 亚洲一区中文字幕在线观看 | 久久久久综合狠狠综合日本高清 | 欧美精品日韩精品 | 国产91精品一区二区绿帽 | 91在线精品一区二区三区 | 黄色大片网站 | 亚洲蜜桃精久久久久久久 | 依人在线免费视频 | 国产精品v一区二区三区 | 一区二区av | 免费a视频在线观看 | 久久久成人免费一区二区 | 久久精品中文字幕大胸 | 久久久人成影片一区二区三区 | 日韩91| 婷婷综合在线 | 精品亚洲一区二区三区四区五区 | 国产一区二区三区免费视频 | 免费观看h片| 日韩城人网站 | 亚洲日本在线观看视频 | 一区精品视频 | 精品无码久久久久国产 | 精品成人在线视频 | 福利网址 | 一本一道久久精品综合 | 国产欧美精品区一区二区三区 | 国产a√| 一区二区不卡 | 久久久精品电影 | 三级黄色在线视频 | 成人自拍视频 | 高清视频一区 | 久久国产精品久久喷水 | 四虎久久 | 国产99久久 | 亚洲欧美综合乱码精品成人网 | 亚洲精品第一页 | 日本电影网址 | 国产综合精品一区二区三区 |