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