溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Hibernate緩存

發(fā)布時(shí)間:2020-06-30 18:38:46 來源:網(wǎng)絡(luò) 閱讀:401 作者:rr57ad15ac80e4a 欄目:數(shù)據(jù)庫

一、Hibernate緩存概述

Hibernate中提供兩個(gè)級(jí)別的緩存,一級(jí)緩存和二級(jí)緩存。

1.一級(jí)緩存是Session級(jí)別的緩存,它屬于事物范圍的緩存,一級(jí)緩存有hibernate進(jìn)行管理。

2.二級(jí)緩存是sessionFactory級(jí)別的緩存,它屬于進(jìn)程范圍的緩存,二級(jí)緩存又可分為"內(nèi)置緩存"和"外置緩存",內(nèi)置緩存:是hibernate在創(chuàng)建sessionFactory時(shí)會(huì)加載.hbn.xml文件并會(huì)在內(nèi)存中初始化一些默認(rèn)的sql語句,該內(nèi)置緩存是只讀的;外置緩存(二級(jí)緩存),默認(rèn)sessionFactory不會(huì)啟動(dòng)這個(gè)緩存插件,外置緩存中的數(shù)據(jù)是數(shù)據(jù)庫中數(shù)據(jù)的復(fù)制,存儲(chǔ)的物理介質(zhì)可以是內(nèi)存或者硬盤。

二、Hibernate一級(jí)緩存

session的緩存有兩大作用:

1.減少訪問數(shù)據(jù)庫的頻率。

2.保證數(shù)據(jù)庫中的相關(guān)記錄與緩存中的相關(guān)對(duì)象保持一致。

Session根據(jù)臟對(duì)象的最新屬性執(zhí)行相關(guān)SQL語句,從而保證了數(shù)據(jù)庫中的相關(guān)記錄與緩存中的響應(yīng)對(duì)象的同步,默認(rèn)在如下時(shí)間點(diǎn),session會(huì)清理緩存:

1.應(yīng)用程序調(diào)用Transaction的commit()方法時(shí),commit()會(huì)先清理緩存,再向數(shù)據(jù)庫提交事務(wù)。

2.應(yīng)用程序執(zhí)行一些查詢操作,緩存中的持久化對(duì)象的屬性發(fā)生變化時(shí)。

3.顯式調(diào)用Session的flush()方法。

Session提供了兩個(gè)管理緩存的方法:

1.evict(Object obj);從緩存中清除特定持久化對(duì)象。

2.clear();清空緩存中,所有持久化對(duì)象。

三、Hibernate二級(jí)緩存

1. 使用 Hibernate 二級(jí)緩存的步驟:

1). 加入二級(jí)緩存插件的 jar 包及配置文件:

I. 復(fù)制 \hibernate-release-4.2.4.Final\lib\optional\ehcache\*.jar 到當(dāng)前 Hibrenate 應(yīng)用的類路徑下.
II. 復(fù)制 hibernate-release-4.2.4.Final\project\etc\ehcachexml 到當(dāng)前 WEB 應(yīng)用的類路徑下

2). 配置 hibernate.cfg.xml下載

I. 配置啟用 hibernate 的二級(jí)緩存
<property name="cache.use_second_level_cache">true</property>

II. 配置hibernate二級(jí)緩存使用的產(chǎn)品
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

III. 配置對(duì)哪些類使用 hibernate 的二級(jí)緩存
<class-cache usage="read-write" class="com.atguigu.hibernate.entities.Employee"/>

實(shí)際上也可以在 .hbm.xml 文件中配置對(duì)哪些類使用二級(jí)緩存, 及二級(jí)緩存的策略是什么.下載

2). 集合級(jí)別的二級(jí)緩存的配置

I. 配置對(duì)集合使用二級(jí)緩存

<collection-cache usage="read-write" collection="com.atguigu.hibernate.entities.Department.emps"/>

也可以在 .hbm.xml 文件中進(jìn)行配置

<set name="emps" table="GG_EMPLOYEE" inverse="true" lazy="true">
<cache usage="read-write"/>
<key>
<column name="DEPT_ID" />
</key>
<one-to-many class="com.atguigu.hibernate.entities.Employee" />
</set>

II. 注意: 還需要配置集合中的元素對(duì)應(yīng)的持久化類也使用二級(jí)緩存! 否則將會(huì)多出 n 條 SQL 語句.

3). ehcache 的 配置文件: ehcache.xml

4). 查詢緩存: 默認(rèn)情況下, 設(shè)置的緩存對(duì) HQL 及 QBC 查詢時(shí)無效的, 但可以通過以下方式使其是有效的

I. 在 hibernate 配置文件中聲明開啟查詢緩存

<property name="cache.use_query_cache">true</property>

II. 調(diào)用 Query 或 Criteria 的 setCacheable(true) 方法
@Test
public void testQueryCache(){
Query query = session.createQuery("FROM Employee");
query.setCacheable(true);

List<Employee> emps = query.list();
System.out.println(emps.size());

emps = query.list();
System.out.println(emps.size());

Criteria criteria = session.createCriteria(Employee.class);
criteria.setCacheable(true);
}
III. 查詢緩存依賴于二級(jí)緩存(使用查詢緩存的前提是配置hibernate二級(jí)緩存)

示例:下載





向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI