1. 程式人生 > >SSH進階(7)——Hibernate使用EHCache進行二級快取

SSH進階(7)——Hibernate使用EHCache進行二級快取

       二級快取也稱為程序級的快取或SessionFactory級的快取,二級快取可以被所有的session共享。二級快取的生命週期和SessionFactory的生命週期一致,SessionFactory可以管理二級快取。

       Hibernate的Session在事務級別進行持久化資料的快取操作。 當然,也有可能分別為每個類(或集合),配置叢集、或JVM級別(SessionFactory級別)的快取。 你甚至可以為之插入一個叢集的快取。注意,快取永遠不知道其他應用程式對持久化倉庫(資料庫)可能進行的修改 (即使可以將快取資料設定為定期失效)。

       預設情況下,Hibernate使用EHCache進行JVM級別的快取(目前,Hibernate已經廢棄了對JCS的支援,未來版本中將會去掉它)。 你可以通過設定hibernate.cache.provider_class屬性,指定其他的快取策略, 該快取策略必須實現org.hibernate.cache.CacheProvider介面。 

二級快取的配置和使用:

* 將ehcache.xml檔案拷貝到src下

* 在hibernate.cfg.xml檔案中加入快取產品提供商

<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

* 啟用二級快取,這也是它的預設配置

<property name="hibernate.cache.use_second_level_cache">true</property>

* 指定哪些實體類使用二級快取

可以在對映檔案中採用<cache>標籤指定或在hibernate.cfg.xml檔案中統一指定。

注意使用的策略,通常採用read-only和read-write

          快取原則:通常讀遠遠大於寫的資料進行快取

         二級快取主要是快取實體物件的,瞭解一級快取和二級快取的互動。注意大批量資料更新時,如果配置了二級快取建議禁用一級快取和二級快取的互動。

Hibernate.cfg.xml:

<!DOCTYPE hibernate-configuration PUBLIC
	"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
	<session-factory>
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property>
		<property name="hibernate.connection.username">root</property>
		<property name="hibernate.connection.password">123456</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<property name="hibernate.show_sql">true</property>
		
		<!-- 配置快取提供商 -->
		<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
		
		<!-- 啟用二級快取,這也是它的預設配置 -->
		<property name="hibernate.cache.use_second_level_cache">true</property>
		
		<mapping resource="com/bjpowernode/hibernate/Student.hbm.xml"/>
		<mapping resource="com/bjpowernode/hibernate/Classes.hbm.xml"/>
		
		<!-- 
			指定Student使用二級快取
		 -->
		<class-cache class="com.bjpowernode.hibernate.Student" usage="read-only"/>
	</session-factory>
</hibernate-configuration>

ehcache.xml:
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        />

Student.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
	"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
	"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.bjpowernode.hibernate.Student" table="t_student">

		<cache usage="read-only"/>
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"/>
		<many-to-one name="classes" column="classesid"/>
	</class>
</hibernate-mapping>


建立junit進行單元測試,在兩個session中發load查詢

	public void testCache1() {
		Session session = null;
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			Student student = (Student)session.load(Student.class, 1);
			System.out.println("student.name=" + student.getName());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			Student student = (Student)session.load(Student.class, 1);
			
			//不會發出查詢語句,因為配置二級快取,session可以共享二級快取中的資料
			//二級快取是程序級的快取
			System.out.println("student.name=" + student.getName());
			session.getTransaction().commit();
		}catch(Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally {
			HibernateUtils.closeSession(session);
		}
		
	}		
       大家看結果可以看出來,二級快取是程序級別的,session共享二級快取中的資料,當第二次查詢的時候,就是從快取中讀資料,而沒有執行hql語句。



總結:          

       快取的應用很重要,可以效能優化。EhCache可作為程序範圍的快取,存放資料的物理介質可以是記憶體或硬碟,對Hibernate的查詢快取提供了支援。在學習過程中,還是多多實踐才能明白這些原理知識。

相關推薦

SSH7——Hibernate使用EHCache進行二級快取

       二級快取也稱為程序級的快取或SessionFactory級的快取,二級快取可以被所有的session共享。二級快取的生命週期和SessionFactory的生命週期一致,SessionF

Android逆向7——揭開Hook的神秘面紗

java字符串 一句話 -o block 模型 它的 寫法 tar 1-1 本文作者:i春秋作家——HAI_ 0×00 前言 HAI_逆向使用手冊(想嘗試一下新的寫法) 其他 Android逆向進階 系列課程 <<<<<<< 人

年薪20萬Python工程師7:Python資源大全,讓你相見恨晚的Python庫 python

我是 環境管理 管理 Python 版本和環境的工具 pyenv – 簡單的 Python 版本管理工具。 Vex – 可以在虛擬環境中執行命令。 virtualenv – 建立獨立 Python 環境的工具。 python程式語言學習 扣群515267276 virtualen

年薪20萬Python工程師7:Python資源大全,讓你相見恨晚的Python庫 python

我是 環境管理 管理 Python 版本和環境的工具 pyenv – 簡單的 Python 版本管理工具。 Vex – 可以在虛擬環境中執行命令。 virtualenv – 建立獨立 Python 環境的工具。 python程式語言學習 扣群515267276

年薪20萬Python工程師7:Python資源大全,讓你相見恨晚的Python庫

我是 環境管理 管理 Python 版本和環境的工具 pyenv – 簡單的 Python 版本管理工具。 Vex – 可以在虛擬環境中執行命令。 virtualenv – 建立獨立 Python 環境的工具。 virtualenvwrappe

SSHSSSHJ---全註解開發

SSSHJ---全註解開發 SpringMVC、Spring、SpringData、HiberanteJPA、MySQL 之前的文章當中提及過HiberanteJPA它完成的其實就是利用註解的方式將類與表,行和物件,欄位與屬性關聯起來的一種實現,在這裡我們將其與Sprin

CSS7—— 內聯元素的掌管者line-height和vertical-align

  在CSS世界中,塊級元素一般負責結構,而內聯元素則負責文字內容,而CSS設計的初衷就是面向圖文混合排版,因此內聯元素在CSS世界中有著非常重要的地位。由於本章內容較多,因此特分為上下兩章,依舊可以根據興趣按小標題獲取你所需要的資訊。 1.字母x與CSS世界的基線 2.內聯元

SSH8——對Hibernate快取的理解

什麼是Hibernate快取?         Hibernate是一個持久層框架,同時是ORM原理的體現,快取的概念很重要。概括的說,Hibernate是對JDBC的進一步封裝,以實現內部狀態的一

python7垃圾回收機制

# Python垃圾回收 基於C語言原始碼底層,讓你真正瞭解垃圾回收機制的實現 - 引用計數器 - 標記清除 - 分代回收 - 快取機制 - Python的C原始碼(3.8.2版本)   # 1.引用計數器   ## 1.1環狀雙向連結串列 refchain 在python中建立的任何

mysql之細談索引、分頁與慢日誌

連表 組合索引 rar 偏移量 最小值 num glob 要求 for 索引 1、數據庫索引   數據庫索引是一種數據結構,可以以額外的寫入和存儲空間為代價來提高數據庫表上的數據檢索操作的速度,以維護索引數據結構。索引用於快速定位數據,而無需在每次訪問數據庫表時搜索數據

python學習之函數學習

python學習之函數進階二一、內置函數 zip函數: zip()是Python的一個內建函數,它接受一系列可叠代的對象作為參數,將對象中對應的 元素按順序組合成一個tuple,每個tuple中包含的是原有序列中對應序號位置的元素,然後返回由 這些tuples組成的list。若傳入參數的長度不等,則返回li

Python自動化開發課堂筆記【Day06】 - Python

擴展性 程序 lex 類名 人物 優點 ini 參數 self. 類與對象 面向過程的程序設計:  優點:極大的降低了程序的復雜度  缺點:一套流水線或者流程就是用來解決一個問題,生產汽水的流水線無法生產汽車,即使能,也是得大改,改一個組件,牽一發而動全身面向對象的程序設計

mysql mysql備份

mysql備份的目的: 實現災難恢復:誤操作、硬件故障、軟件故障、自然災害、黑客攻擊 註意的要點: 1、能夠容忍丟失多少數據 2、恢復數據所用的時間 3、備份需要的時間 4、是否對業務有影響 5、備份時服務器負載 備份類型 完全備份:備份整個

蘋果新的編程語言 Swift 語言--基本數據類型

保持 popu 多條語句 常量 num access 對象 程序 進制 一 、 常量和變量 Swift語言 對常量和變量的聲明進行了明白的區分 Swift語言的常量類型比C 語言的co

mysqlMHA高可用集群

mysql mha簡介: 1、MHA目前在MySQL高可用方面是一個相對成熟的解決方案,是MySQL高可用環境下故障切換和主從提升的高可用軟件 2、MHA能在短時間內完成故障切換,並且在最大程度上保證數據的一致性,以達到真正意義上的高可用 3、MHA基於mysql協議,通過mysql主從或主主進行復制 4、

Python3_程與線程中的lock互斥鎖、遞歸鎖、信號量

fun 我們 bsp 控制 支持 發生 class 線程 數據操作 1、同步鎖 (Lock) 當各個線程需要訪問一個公共資源時,會出現數據紊亂 例如: 1 import threading,time 2 def sub(): 3 global num

自己定義ViewGroup控件-----&gt;流式布局

avi ride sch get spec tracking htm out fst main.xml <?xml version="1.0" encoding="utf-8"?> <com.exa

函數

並行 自己的 習題 文件 false 聲明 方式 關鍵字 true 1.命名空間 本質:存放名字與值的綁定關系 命名空間的分類:(1)全局命名空間(變量)->位於函數體外 (2)局部命名空間(變量)->

蘋果新的編程語言 Swift 語言十三--類型檢查與類型嵌套

兩個類 nes left p s 查詢 text edi host letter 一 類型檢查 1、 類型檢查操作符 類型檢查用來檢查或轉換一個實例的類型到另外的類型的一種方式。 在Swift中,類型檢查使用is和as操作符來實現。

ArcGIS 高級地圖緩存技術[5] 地圖緩存——緩存的更新與遷移

分享 win paste margin 地圖 com left 導入 block 1.緩存遷移 在ArcGIS 10 中新加入導入/導出緩存工具 能在緊湊和松散緩存之間轉換 可以導出為離線緩存 2.拷貝緩存 1)緊湊型緩存 可使用任意工具 2)松散型緩存 Win