1. 程式人生 > >Hibernate二級快取以及ehcache的搭建配置

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

前言

        這次主要複習Hibernate的二級快取的相關知識,配置以及使用。二級快取主要採用第三方的ehcache,也將介紹ehcache快取的相關配置屬性以及在專案中的搭建,具體的專案檢視下一篇的 Maven搭建SpringMVC+Hibernate專案詳 的文章。(之前使用過Hibernate的二級快取,但是沒自己搭建和研究過,現在花了半天時間搭建了一下,寫下來供大家參考)

1、Hibernate二級快取

     Hibernate包括兩個級別的快取:

        1、一級快取:預設總是啟用的session級別的。

         2、二級快取:可選的SessionFactory級別的。

       Session級別的以及快取總是有效的,當應用保持持久化實體、修改持久化實體時,Session並不會吧這種改變flush到資料庫,而是快取在當前Session的一級快取中,除非程式顯示呼叫session的flush方法,或者查詢關閉session時,才會把這先改變一次性的flush到底層資料庫,這樣可以減少與資料庫的互動,從而提高資料庫的訪問效能。

      SessionFactory級別的二級快取是全域性的,應用的所有的Seeion都共享這個二級快取,當Session需要抓取資料時,Session就會優先從二級快取中抓取。(主要包括實體快取,查詢快取)。

2、適用範圍

      主要適合以下資料放入二級快取:

           1. 很少被修改,大量查詢的

            2. 不是很重要的資料,允許出現偶爾併發訪問的

3、Hibernate二級快取的配置

              Hibernate的二級快取主要使用第三方快取外掛,這裡主要使用Ehcache二級快取。

         首先、我們需要映入ehcache包以及hibernate-ehcache包,maven的pom.xml映入如下:

               <!-- hibernate -->
		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-core</artifactId>
			<version>4.3.8.Final</version>
		</dependency>

		<dependency>
			<groupId>org.hibernate</groupId>
			<artifactId>hibernate-ehcache</artifactId>
			<version>4.3.8.Final</version>
		</dependency>
		
		<!-- 二級快取ehcache -->
		<dependency>
			<groupId>net.sf.ehcache</groupId>
			<artifactId>ehcache</artifactId>
			<version>2.9.0</version>
		</dependency>

         其次、我們需要在Hibernate的配置檔案中設定二級快取的相關資訊
	<!-- 開啟二級快取 ehcache -->
	<prop key="hibernate.cache.use_second_level_cache">true</prop>
	<!-- 開啟查詢的二級快取  如果不需要就不設定-->
	<prop key="hibernate.cache.use_query_cache">true</prop>
	<!-- Hibernate4.0以上設定factory -->
	<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
	<!-- 二級快取 ehcache的配置檔案位置 -->
	<prop key="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</prop>

            一般Hibernate的二級快取實體和屬性的快取對映,如果需要將查詢資料也二級快取,需要使用hibernate.cache.use_query_cache開啟。

4、Ehcache的配置

      ehcache.xml的配置檔案如下:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
	
	<diskStore path="java.io.tmpdir/ehcache" />
	<!-- DefaultCache setting. -->
     <defaultCache
            maxElementsInMemory="1000"
            eternal="false"
            timeToIdleSeconds="300"
            timeToLiveSeconds="300"
            maxElementsOnDisk="1000000"
            overflowToDisk="true" 
            memoryStoreEvictionPolicy="LRU">
            
    </defaultCache>

	<!-- Special objects setting. -->
	<!-- 
	<cache 
	     name="org.andy.work.entity.AcctUser"
		 maxElementsInMemory="2"
		 memoryStoreEvictionPolicy="LRU" 
		 eternal="true" 
		 diskPersistent="false"
		 overflowToDisk="false" 
		 maxElementsOnDisk="1000000" /> -->



</ehcache>

第一段是配置預設的ehcache二級快取資訊,第二段是特殊的配置(需要配置特殊時)。

4.1、配置詳解

    name:快取名稱。
    maxElementsInMemory:快取最大個數。
    eternal:物件是否永久有效,一但設定了,timeout將不起作用。
    timeToIdleSeconds:設定物件在失效前的允許閒置時間(單位:秒)。僅當eternal=false物件不是永久有效時使用,可選屬性,預設值是0,也就是可閒置時間無窮大。
    timeToLiveSeconds:設定物件在失效前允許存活時間(單位:秒)。最大時間介於建立時間和失效時間之間。僅當eternal=false物件不是永久有效時使用,預設是0.,也就是物件存活時間無窮大。
   overflowToDisk:當記憶體中物件數量達到maxElementsInMemory時,Ehcache將會物件寫到磁碟中。
   diskSpoolBufferSizeMB:這個引數設定DiskStore(磁碟快取)的快取區大小。預設是30MB。每個Cache都應該有自己的一個緩衝區。
   maxElementsOnDisk:硬碟最大快取個數。
   diskPersistent:是否快取虛擬機器重啟期資料 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
   diskExpiryThreadIntervalSeconds:磁碟失效執行緒執行時間間隔,預設是120秒。
   memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理記憶體。預設策略是LRU(最近最少使用)。你可以設定為FIFO(先進先出)或是LFU(較少使用)。
   clearOnFlush:記憶體數量最大時是否清除。

   注:java.io.tmpdir目錄為:C:\Users\登入使用者\AppData\Local\Temp\(window環境中),所以上面在我的電腦下的目錄如下(已經有快取內容):

      

     當然儲存位置我們可以隨意的配置如:   <diskStore path="D:/ehcache" />  就是在D盤下的ehcache目錄了。

5、配置需二級快取實體和屬性

      這裡只介紹註解形式的,xml形式的不說了,大多數公司都用註解。

    在實體類和實體的那些集合屬性上啟用二級快取使用

              @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)

   注:如果一個實體需要二級快取,若該實體含有<set...>,<list...>等屬性時,也必須要指定快取策略。

       如下:

package org.andy.work.entity;

// Generated 2015-2-3 10:43:00 by Hibernate Tools 4.0.0

import java.util.Date;
import java.util.HashSet;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import org.hibernate.annotations.Cache;
import org.hibernate.annotations.CacheConcurrencyStrategy;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

/**
 * AcctUser generated by hbm2java
 */
@Entity
@Table(name = "acct_user", catalog = "work")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class AcctUser implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6980093847795726310L;
	private String id;
	private String nickName;
	private String telephone;
	private Date registerTime;
	private Set<AcctRole> acctRoles = new HashSet<AcctRole>(0);

	public AcctUser() {

	}

	public AcctUser(String id, String nickName) {
		this.id = id;
		this.nickName = nickName;
	}

	public AcctUser(String id, String nickName, String telephone,
			Date registerTime, Set<AcctRole> acctRoles) {
		this.id = id;
		this.nickName = nickName;
		this.telephone = telephone;
		this.registerTime = registerTime;
		this.acctRoles = acctRoles;
	}

	@Id
	@Column(name = "id", unique = true, nullable = false, length = 36)
	public String getId() {
		return this.id;
	}

	public void setId(String id) {
		this.id = id;
	}

	@Column(name = "nick_name", nullable = false)
	public String getNickName() {
		return this.nickName;
	}

	public void setNickName(String nickName) {
		this.nickName = nickName;
	}

	@Column(name = "telephone")
	public String getTelephone() {
		return this.telephone;
	}

	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "register_time", length = 19)
	public Date getRegisterTime() {
		return this.registerTime;
	}

	public void setRegisterTime(Date registerTime) {
		this.registerTime = registerTime;
	}

	@JsonIgnoreProperties(value={"acctUsers", "acctAuthorities"})
	@ManyToMany(fetch = FetchType.LAZY)
	@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
	@JoinTable(name = "acct_user_role", catalog = "work", joinColumns = { @JoinColumn(name = "user_id", nullable = false, updatable = false) }, inverseJoinColumns = { @JoinColumn(name = "role_id", nullable = false, updatable = false) })
	public Set<AcctRole> getAcctRoles() {
		return this.acctRoles;
	}

	public void setAcctRoles(Set<AcctRole> acctRoles) {
		this.acctRoles = acctRoles;
	}

}

5.1、快取usage事務隔離機制

        Usage提供快取物件的事務隔離機制有如下幾種:

        (NONE, READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL)

      ehcache不支援transaction事務機制,但其他三種可以使用:

       read-only::

                 無需修改, 那麼就可以對其進行只讀 快取,注意,在此策略下,如果直接修改資料庫,即使能夠看到前臺顯示效果,

             但是將物件修改至cache中會報error,cache不會發生作用。另:刪除記錄會報錯,因為不能在read-only模式的物件從cache中刪除。

      read-write: 

                   需要更新資料,那麼使用讀/寫快取 比較合適,前提:資料庫不可以為serializable transaction isolation level(序列化事務隔離級別)

     nonstrice-read-write:

                  只偶爾需要更新資料(也就是說,兩個事務同時更新同一記錄的情況很不常見),也不需要十分嚴格的事務隔離,那麼比較適合使用非嚴格讀/寫快取策略。

6、使用查詢快取

      查詢快取所快取的key值就是查詢所使用的HQL或SQL語句,需要注意的是:查詢快取不僅要求所使用的HQL語句、SQL語句相同,甚至是要求所傳入的引數也相同,Hibernate才能從快取中查去資料。

   查詢快取有如下兩步:

      1、查詢快取不不僅開啟 hibernate.cache.use_query_cache

      2、還需要在查詢時使用  setCacheable(true)

	public List<AcctUser> findAll() {
		List<AcctUser> acctUsers = this.getCurrentSession().createQuery("from AcctUser").setCacheable(true).list();
		
		return acctUsers;
	}


相關推薦

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

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

hibernate二級快取 Ehcache配置詳解

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

搭建Hibernate二級快取EHcache的環境

常見的快取元件 在預設情況下,hibernate會使用EHCache作為二級快取元件。但是,可以通過設定hibernate.cache.provider_class屬性,指定其他的快取策略,該快取策略必須實現org.hibernate.cache.Cach

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

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

Hibernate 二級快取-ehcache

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

Hibernate二級快取技術 EhCache

一、Ehcache簡介       EhCache是Hibernate的二級快取技術之一,可以把查詢出來的資料儲存在記憶體或者磁碟,節省下次同樣查詢語句再次查詢資料庫,大幅減輕資料庫壓力;       當用Hibernate對關係型資料庫表進行更改時(DELETE/UPDA

Hibernate 二級快取和查詢快取

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

Hibernate 二級快取的作用

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

Hibernate二級快取問題

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

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

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

關於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快取檔案建立

mybatis中二級快取整合ehcache實現分散式快取

    mybatis自帶二級快取,但是這個快取是單伺服器工作,無法實現分散式快取。那麼什麼是分散式快取呢?假設現在有兩個伺服器1和2,使用者訪問的時候訪問了1伺服器,查詢後的快取就會放在1伺服器上,假設現在有個使用者訪問的是2伺服器,那麼他在2伺服器上就無法獲取剛剛那個快取

SSH開啟Hibernate二級快取

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

hibernate 二級快取

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

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

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

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

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

hibernate二級快取機制

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

hibernate二級快取測試

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