1. 程式人生 > >Hibernate 二級快取 收集、總結整理

Hibernate 二級快取 收集、總結整理

快取:快取是什麼,解決什麼問題? 
位於速度相差較大的兩種硬體/軟體之間的,用於協調兩者資料傳輸速度差異的結構,均可稱之為快取Cache。快取目的:讓資料更接近於應用程式,協調速度不匹配,使訪問速度更快。 

快取的範圍分為3類: 

1.事務範圍(單Session即一級快取) 
   事務範圍的快取只能被當前事務訪問,每個事務都有各自的快取,快取內的資料通常採用相互關聯的物件形式.快取的生命週期依賴於事務的生命週期,只有當事務結束時,快取的生命週期才會結束.事務範圍的快取使用記憶體作為儲存介質,一級快取就屬於事務範圍. 
2.應用範圍(單SessionFactory即二級快取) 
   應用程式的快取可以被應用範圍內的所有事務共享訪問.快取的生命週期依賴於應用的生命週期,只有當應用結束時,快取的生命週期才會結束.應用範圍的快取可以使用記憶體或硬碟作為儲存介質,二級快取就屬於應用範圍. 
3.叢集範圍(多SessionFactory)
 
   在叢集環境中,快取被一個機器或多個機器的程序共享,快取中的資料被複制到叢集環境中的每個程序節點,程序間通過遠端通訊來保證快取中的資料的一致,快取中的資料通常採用物件的鬆散資料形式.

二級快取如何工作的 
Hibernate的二級快取同一級快取一樣,也是針對物件ID來進行快取。所以說,二級快取的作用範圍是針對根據ID獲得物件的查詢。 
● 在執行各種條件查詢時,如果所獲得的結果集為實體物件的集合,那麼就會把所有的資料物件根據ID放入到二級快取中。 
● 當Hibernate根據ID訪問資料物件的時候,首先會從Session一級快取中查詢,如果查不到並且配置了二級快取,那麼會從二級快取中查詢,如果還查不到,就會查詢資料庫,把結果按照ID放入到快取中。 
● 刪除、更新、增加資料的時候,同時更新快取。 

與Hibernate一級快取Session範圍相對的是SessionFactory範圍的二級快取
,SessionFactory也提供了相應的快取機制。SessionFactory快取可以依據功能和目的的不同而劃分為內建快取和外接快取。 

SessionFactory的內建快取中存放了對映元資料和預定義SQL語句,對映元資料是對映檔案中資料的副本,而預定義SQL語句是在Hibernate初始化階段根據對映元資料推匯出來的。SessionFactory的內建快取是隻讀的,應用程式不能修改快取中的對映元資料和預定義SQL語句,因此SessionFactory不需要進行內建快取與對映檔案的同步。 

SessionFactory的外接快取是一個可配置的外掛。在預設情況下,SessionFactory不會啟用這個外掛。外接快取的資料是資料庫資料的副本,外接快取的介質可以是記憶體或者硬碟。SessionFactory的外接快取也被稱為Hibernate的二級快取。 

Hibernate的二級快取的實現原理與一級快取是一樣的,也是通過以ID為key的Map來實現對物件的快取。 

二級快取是快取實體物件的,由於Hibernate的二級快取是作用在SessionFactory範圍內的,因而它比一級快取的範圍更廣,可以被所有的Session物件所共享。 

在通常情況下會將具有以下特徵的資料放入到二級快取中:
 
● 很少被修改的資料。 
● 不是很重要的資料,允許出現偶爾併發的資料。 
● 不會被併發訪問的資料。 
● 常量資料。 
● 不會被第三方修改的資料 

而對於具有以下特徵的資料則不適合放在二級快取中: 
● 經常被修改的資料。 
● 財務資料,絕對不允許出現併發。 
● 與其他應用共享的資料。 

在這裡特別要注意的是對放入快取中的資料不能有第三方的應用對資料進行更改(其中也包括在自己程式中使用其他方式進行資料的修改,例如,JDBC),因為那樣Hibernate將不會知道資料已經被修改,也就無法保證快取中的資料與資料庫中資料的一致性。 

常見的快取元件 
在預設情況下,Hibernate會使用EHCache作為二級快取元件。但是,可以通過設定hibernate.cache.provider_class屬性,指定其他的快取策略,該快取策略必須實現org.hibernate.cache.CacheProvider介面。 
通過實現org.hibernate.cache.CacheProvider介面可以提供對不同二級快取元件的支援,此介面充當快取外掛與Hibernate之間的介面卡。 
元件 Provider類 型別 叢集 查詢快取
Hashtable org.hibernate.cache.HashtableCacheProvider 記憶體 不支援 支援
EHCache org.hibernate.cache.EhCacheProvider 記憶體,硬碟 不支援 支援
OSCache org.hibernate.cache.OSCacheProvider 記憶體,硬碟 支援 支援
SwarmCache org.hibernate.cache.SwarmCacheProvider 叢集 支援 不支援
JBoss TreeCache org.hibernate.cache.TreeCacheProvider 叢集 支援 支援

Hibernate已經不再提供對JCS(Java Caching System)元件的支援了。 
叢集快取的概念:
當一臺伺服器上的執行了update方法修改了一條資料,那麼只有這一臺伺服器上的二級快取會同步於資料庫,其他伺服器上的二級快取裡面這條資料就沒意義了。這個時候用OSCache快取機制,只要有一臺伺服器上有資料修改了,馬上會從配置檔案中找到配置好的其他伺服器IP地址,進行廣播,告訴他們我這條資料修改了,你們也更新同步一下。(是不是有點像手機上微博的推送功能) 

如何在程式裡使用二級快取:

在hibernate.cfg.xml開啟二級快取 

Xml程式碼  收藏程式碼
  1. <hibernate-configuration>  
  2.    <session-factory>  
  3.       ......  
  4.       <!-- 開啟二級快取 -->  
  5.       <property name="hibernate.cache.use_second_level_cache">true</property>  
  6.       <!-- 啟動"查詢快取"如果想快取使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的資料結果集,必須配置此項-->  
  7.       <property name="hibernate.cache.use_query_cache">true</property>  
  8.       <!-- 設定二級快取外掛EHCache的Provider類-->  
  9.       <!-- <property name="hibernate.cache.provider_class">  
  10.          org.hibernate.cache.EhCacheProvider  
  11.       </property> -->  
  12.       <!-- 二級快取區域名的字首 -->  
  13.       <!--<property name="hibernate.cache.region_prefix">test</property>-->  
  14.       <!-- 快取記憶體提供程式 -->  
  15.       <property name="hibernate.cache.region.factory_class">  
  16.          net.sf.ehcache.hibernate.EhCacheRegionFactory  
  17.       </property>  
  18.       <!-- Hibernate4以後都封裝到org.hibernate.cache.ehcache.EhCacheRegionFactory -->  
  19.       <!-- 指定快取配置檔案位置 -->  
  20.       <!-- <property name="hibernate.cache.provider_configuration_file_resource_path">  
  21.          ehcache.xml  
  22.       </property> -->  
  23.       <!-- 強制Hibernate以更人性化的格式將資料存入二級快取 -->  
  24.       <property name="hibernate.cache.use_structured_entries">true</property>  
  25.       <!-- Hibernate將收集有助於效能調節的統計資料 -->  
  26.       <property name="hibernate.generate_statistics">true</property>  
  27.       ......  
  28.    </session-factory>  
  29. </hibernate-configuration>  

然後是ehcache配置(ehcache.xml) 
cache引數詳解: 
● name:指定區域名 
● maxElementsInMemory :快取在記憶體中的最大數目 
● maxElementsOnDisk:快取在磁碟上的最大數目 
● eternal :設定是否永遠不過期 
● overflowToDisk : 硬碟溢位數目 
● timeToIdleSeconds :物件處於空閒狀態的最多秒數後銷燬 
● timeToLiveSeconds :物件處於快取狀態的最多秒數後銷燬 
● memoryStoreEvictionPolicy:快取演算法,有LRU(預設)、LFU、LFU 

關於快取演算法,常見有三種: 
● LRU:(Least Rencently Used)新來的物件替換掉使用時間算最近很少使用的物件 
● LFU:(Least Frequently Used)替換掉按命中率高低算比較低的物件 
● LFU:(First In First Out)把最早進入二級快取的物件替換掉 


Xml程式碼  收藏程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <ehcache>  
  3.   <!--如果快取中的物件儲存超過指定的快取數量的物件儲存的磁碟地址-->  
  4.   <diskStore path="D:/ehcache"/>  
  5.   <!-- 預設cache:如果沒有對應的特定區域的快取,就使用預設快取 -->  
  6.   <defaultCache maxElementsInMemory="10000"  
  7.                 eternal="false"  
  8.                 timeToIdleSeconds="300"   
  9.                 timeToLiveSeconds="600"  
  10.                 overflowToDisk="false"/>  
  11.   <!-- 指定區域cache:通過name指定,name對應到Hibernate中的區域名即可-->  
  12.   <cache name="cn.javass.h3test.model.UserModel"  
  13.                 eternal="false"  
  14.                 maxElementsInMemory="100"  
  15.                 timeToIdleSeconds="1200"  
  16.                 timeToLiveSeconds="1200"  
  17.                 overflowToDisk="false">  
  18.   </cache>  
  19. </ehcache>  

在每個實體的hbm檔案中配置cache元素,usage可以是read-only或者是read-write等4種。

  1. <?xml version="1.0" encoding='UTF-8'?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3.                             "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
  4. <hibernate-mapping>      
  5.    <class>  
  6.        <!-- 設定該持久化類的二級快取併發訪問策略 read-only read-write nonstrict-read-write transactional-->  
  7.        <class name="cn.java.test.model.User" table="TBL_USER">  
  8.               <cache usage="read-write"/>  
  9.        ......    
  10.    </class>  
  11. </hibernate-mapping>  

也可以用Hibernate註解配置快取實體類

    相關推薦

    Hibernate 二級快取 收集總結整理

    快取:快取是什麼,解決什麼問題?  位於速度相差較大的兩種硬體/軟體之間的,用於協調兩者資料傳輸速度差異的結構,均可稱之為快取Cache。快取目的:讓資料更接近於應用程式,協調速度不匹配,使訪問速度更快。  快取的範圍分為3類:  1.事務範圍(單Sessi

    Hibernate 二級快取和查詢快取

    一級快取:     1,在session上面有一個一級快取;一級快取的生命週期和session相同,一級快取最大生命週期就是一個執行緒;在web環境下面,session的最大生命週期就是一次請求;     2,一級快取可以用來幹嘛? &nb

    Hibernate 二級快取的作用

    使用快取,是需要對應用系統進行效能優化而常採用的一種重要手段。合理地運用快取,可以極大的提高應用系統的執行效率。 Hibernate中應用快取:因為應用程式訪問資料庫,讀寫資料的代價非常高,而利用持久層的快取可以減少應用程式與資料庫之間的互動,即把訪問過的資料儲存到快取中,應用程式再次訪問已經訪

    Hibernate二級快取問題

    相關概念和定義1、快取的意義把一些不常修改,但是又經常用的資料存放到記憶體中,這樣能減少與資料庫的互動,提升程式的效能 2、Hibernate中提供了兩級快取:第一級別的快取是Session級別的快取(比如說在呼叫get方法的時候,如果已經查詢過一次了,第二次就不會查了,而是直接返回session快取中已經

    hibernate 二級快取和事務級別詳講

    一、概述 這章總的分兩大塊來講解   第一大塊,hibernate的事務管理。對於hibernate的事務管理來說,如果之前學過資料庫的事務管理,那麼在這裡就順風順水了。如果沒學過,第一次遇到,那也沒關係,我會詳細解釋其中的內容。   第二大塊,hibernate的二級快取機制。這個看起

    spring boot整合ehcache 2.x 用於hibernate二級快取

    spring boot整合ehcache 2x 用於hibernate二級快取 專案依賴 Ehcache簡介 hibernate二級快取配置 ehcache配置檔案 ehcache事件監聽 註解方式使用二級快取 完整程式碼 本文將介紹如何在spring boot中整合ehcache作為hiberna

    關於hibernate 二級快取 報錯問題

    Maven   hibernate-ehcache 和hibernate-core版本需要一致 <dependency> <groupId>org.hibernate</groupId> <artifactId>h

    Hibernate二級快取

    Hibernate中沒有自己去實現二級快取,而是利用第三方的。簡單敘述一下配置過程,也作為自己以後用到的時候配置的一個參考。 1、我們需要加入額外的二級快取包,例如EHcache,將其包匯入。需要:ehcache-core-2.4.3.jar , hibernate-e

    Hibernate二級快取實現的方式(在類中,在方法上實現的思路)

    資料庫快取 - 幕布 資料庫快取兩種處理方式一種處理model,只查詢快取,不更新快取參考列子 使用者表的敏感詞列表思路專案pom檔案匯入hibernate-encache快取檔案建立

    SSH開啟Hibernate二級快取

    1、新增ehcache依賴: <!-- Hibernate二級快取依賴 --> <dependency> <groupId>org.hibernate</groupId> <artifac

    Hibernate 二級快取-ehcache

    1 新增依賴包 <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>

    hibernate 二級快取

    一、為什麼需要快取? 拉高程式效能 二、什麼樣的資料需要快取 很少被修改或根本不改的資料 業務場景比如:耗時較高的統計分析sql、電話賬單查詢sql等 三、 ehcache的特點 1 夠快 Ehcache的發行有一段時長了,經過幾年的努力和不計其數的效能測試,E

    hibernate 二級快取和查詢快取原理和關係

    一、hibernate的二級快取 如果開啟了二級快取,hibernate在執行任何一次查詢的之後,都會把得到的結果集放到快取中,快取結構可以看作是一個hash table,key是資料庫記錄的id,value是id對應的pojo物件。當用戶根據id查詢物件的時候(load、iterator方法),會首先在

    hibernate二級快取 Ehcache配置詳解

    一、hibernate快取簡介 一級快取(session):內部快取 事務範圍:快取只能被當前事務訪問。快取的生命週期依賴於事務的生命週期,當事務結束時,快取也就結束生命週期。 二級快取(sessionFactory): 快取被應用範圍內的所有事務共享。 這些事務

    hibernate二級快取攻略(第二天)

    查詢快取 首先需要配置 hibernate.cache.use_query_cache = true  如果用ehcache,配置ehcache.xml,注意hibernate3.0以後不是net.sf的包名了 < cache name = " net.sf.

    Hibernate二級快取以及ehcache的搭建配置

    前言         這次主要複習Hibernate的二級快取的相關知識,配置以及使用。二級快取主要採用第三方的ehcache,也將介紹ehcache快取的相關配置屬性以及在專案中的搭建,具體的專案檢視下一篇的 Maven搭建SpringMVC+Hibernate專案詳解

    hibernate二級快取機制

    二級快取不像一級快取那樣預設開啟的,它需要配置。二級快取中的資料可適用範圍是當前應用的所有會話 在這些情況下面應該使用二級快取: 1.很少被修改的資料。如果經常修改的話要修改資料庫而且要修改快取裡面

    hibernate二級快取測試

    SessionFactory類: import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; imp

    Hibernate二級快取併發說明

    二級快取的策略        當多個併發的事務同時訪問持久化層的快取中的相同資料時,會引起併發問題,必須採用必要的事務隔離措施。        在程序範圍或叢集範圍的快取,即第二級快取,會出現併發問題。因此可以設定以下4種類型的併發訪問策略,每一種策略對應一種事務隔離級別。

    Java程式設計師從笨鳥到菜鳥之(七十七)細談Hibernate(十九)Hibernate二級快取詳解

    歡迎關注微信賬號:java那些事:csh624366188.每天一篇java相關的文章 java交流工作群1: 77800592(已滿) java交流學生群2:234897635(已滿) java交流工作群3:94507287 java交流工作群4: 272265434 我的郵箱: