當前位置:首頁 » 文件管理 » hibernate中緩存

hibernate中緩存

發布時間: 2022-08-31 01:22:16

『壹』 面試中問到HIBERNATE的緩存機制請問下該怎麼回答

首先說下Hibernate緩存的作用(即為什麼要用緩存機制),然後再具體說說Hibernate中緩存的分類情況,最後可以舉個具體的例子。

『貳』 hibernate如何進行緩存

緩存是位於應用程序與物理數據源之間,用於臨時存放復制數據的內存區域,目的是為了減少應用程序對物理數據源訪問的次數,從而提高應用程序的運行性能.
Hibernate在查詢數據時,首先到緩存中去查找,如果找到就直接使用,找不到的時候就會從物理數據源中檢索,所以,把頻繁使用的數據載入到緩存區後,就可以大大減少應用程序對物理數據源的訪問,使得程序的運行性能明顯的提升.

Hibernate緩存分類:

Session緩存,一級緩存.

SessionFactory的緩存分為內置緩存和外置緩存.內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據及預定義sql語句等),對於應用程序來說,它是只讀的.外置緩存中存放的是資料庫數據的副本,其作用和一級緩存類似.二級緩存除了以內存作為存儲介質外,還可以選用硬碟等外部存儲設備.

Hibernate的緩存范圍

Hibernate的一級緩存和二級緩存都位於均位於持久層,且均用於存放資料庫數據的副本,最大的區別就是緩存的范圍各不一樣.

緩存的范圍分為3類:

1.事務范圍
事務范圍的緩存只能被當前事務訪問,每個事務都有各自的緩存,緩存內的數據通常採用相互關聯的對象形式.緩存的生命周期依賴於事務的生命周期,只有當事務結束時,緩存的生命周期才會結束.事務范圍的緩存使用內存作為存儲介質,一級緩存就屬於事務范圍.
2.應用范圍
應用程序的緩存可以被應用范圍內的所有事務共享訪問.緩存的生命周期依賴於應用的生命周期,只有當應用結束時,緩存的生命周期才會結束.應用范圍的緩存可以使用內存或硬碟作為存儲介質,二級緩存就屬於應用范圍.
3.集群范圍
在集群環境中,緩存被一個機器或多個機器的進程共享,緩存中的數據被復制到集群環境中的每個進程節點,進程間通過遠程通信來保證緩存中的數據的一致,緩存中的數據通常採用對象的鬆散數據形式.

Hibernate的緩存管理

一級緩存的管理:

evit(Object obj) 將指定的持久化對象從一級緩存中清除,釋放對象所佔用的內存資源,指定對象從持久化狀態變為脫管狀態,從而成為游離對象.
clear() 將一級緩存中的所有持久化對象清除,釋放其佔用的內存資源
contains(Object obj) 判斷指定的對象是否存在於一級緩存中.
flush() 刷新一級緩存區的內容,使之與資料庫數據保持同步.

二級緩存的管理:

evict(Class arg0, Serializable arg1) 將某個類的指定ID的持久化對象從二級緩存中清除,釋放對象所佔用的資源.
java代碼 sessionFactory.evict(Customer.class, new Integer(1)); sessionFactory.evict(Customer.class, new Integer(1));
evict(Class arg0) 將指定類的所有持久化對象從二級緩存中清除,釋放其佔用的內存資源.
Java代碼 sessionFactory.evict(Customer.class); sessionFactory.evict(Customer.class);
evictCollection(String arg0) 將指定類的所有持久化對象的指定集合從二級緩存中清除,釋放其佔用的內存資源.
Java代碼 sessionFactory.evictCollection("Customer.orders"); sessionFactory.evictCollection("Customer.orders");

Hibernate的二級緩存的配置

首先,不是所有的數據都適合放在二級緩存中,看一下,什麼樣的數據適合放在二級緩存中來?什麼樣的數據不適合放在二級緩存中來?
下面這幾種情況就不適合載入到二級緩存中:
1.經常被修改的數據
2.絕對不允許出現並發訪問的數據
3.與其他應用共享的數據
下面這己種情況合適載入到二級緩存中:
1.數據更新頻率低
2.允許偶爾出現並發問題的非重要數據
3.不會被並發訪問的數據
4.常量數據
5.不會被第三方修改的數據

Hibernate的二級緩存功能是靠配置二級緩存插件來實現的,Hibernate為了集成這些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充當緩存插件與Hibernate之間的適配器 .

常用的二級緩存插件
EHCache org.hibernate.cache.EhCacheProvider
OSCache org.hibernate.cache.OSCacheProvider
SwarmCahe org.hibernate.cache.SwarmCacheProvider
JBossCache org.hibernate.cache.TreeCacheProvider

簡單介紹一下EHCache的配置
hibernate.cfg.xml
Xml代碼 <hibernate-configuration> <session-factory> <!-- 設置二級緩存插件EHCache的Provider類--> <property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </property> <!-- 啟動"查詢緩存" --> <property name="hibernate.cache.use_query_cache"> true </property> </session-factory> </hibernate-configuration> <hibernate-configuration> <session-factory> <!-- 設置二級緩存插件EHCache的Provider類--> <property name="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </property> <!-- 啟動"查詢緩存" --> <property name="hibernate.cache.use_query_cache"> true </property> </session-factory> </hibernate-configuration>

ehcache.xml

Xml代碼 <ehcache> <!-- maxElementsInMemory為緩存對象的最大數目, eternal設置是否永遠不過期,timeToIdleSeconds對象處於空閑狀態的最多秒數,timeToLiveSeconds對象處於緩存狀態的最多秒數 --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/> </ehcache> <ehcache> <!-- maxElementsInMemory為緩存對象的最大數目, eternal設置是否永遠不過期,timeToIdleSeconds對象處於空閑狀態的最多秒數,timeToLiveSeconds對象處於緩存狀態的最多秒數 --> <diskStore path="java.io.tmpdir"/> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/></ehcache>

****.hbm.xml

Xml代碼 <?xml version="1.0" encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping> <class> <!-- 設置該持久化類的二級緩存並發訪問策略 read-only read-write nonstrict-read-write transactional--> <cache usage="read-write"/> </class> </hibernate-mapping> <?xml version="1.0" encoding='UTF-8'?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" " http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" > <hibernate-mapping> <class> <!-- 設置該持久化類的二級緩存並發訪問策略 read-only read-write nonstrict-read-write transactional--> <cache usage="read-write"/> </class> </hibernate-mapping>

『叄』 什麼是Hibernate緩存

hibernate 一般用到是一級緩存 也就是 session級別的緩存;

二級緩存指的是sessionfactory的緩存;

『肆』 怎麼優化hibernate緩存

hibernate的一級緩存是由session提供的,因此它只存在session的生命周期中。也就是說session關閉的時候該session所管理的一級緩存也隨之被清除。hibernate的一級緩存是session所內置的,默認開啟,不能被卸載,也不能進行任何配置。在緩存中的對象,具有持久性,session對象負責管理.一級緩存的優點是使用同一個session對象多次查詢同一個數據對象,僅對資料庫查詢一次。一級緩存採用的是Key-Value的MAP方式來實現的。在緩存實體對象時,對象的主關鍵字ID是MAP的Key,實體對象就是對象的值。所以說一級緩存是以實體對象為單位進行存儲的。訪問的時候使用的是主鍵關鍵字ID。一級緩存使用的是自動維護的功能。但可以通過session提供的手動方法對一級緩存的管理進行手動干預。evict()方法用於將某個對象從session的一級緩存中清除。clear()方法用於將session緩存中的方法全部清除。

『伍』 Hibernate二級緩存的作用是什麼

使用緩存,是需要對應用系統進行性能優化而常採用的一種重要手段。合理地運用緩存,可以極大的提高應用系統的運行效率。
Hibernate中應用緩存:因為應用程序訪問資料庫,讀寫數據的代價非常高,而利用持久層的緩存可以減少應用程序與資料庫之間的交互,即把訪問過的數據保存到緩存中,應用程序再次訪問已經訪問過的數據,這些數據就可以從緩存中獲取,而不必再從資料庫中獲取。同時如果資料庫中的數據被修改或者刪除,那麼是、該數據所對應的緩存數據,也會被同步修改或刪除,進而保持緩存數據的一致性。

Hibernate的二級緩存由SessionFactory對象管理,是應用級別的緩存。它可以緩存整個應用的持久化對象,所以又稱為「SessionFactory緩存」。
hibernate二級緩存中的緩存對象可以被整個應用的Session對象共享,即使關閉當前Session對象,新建的Session對象仍可使用。使用Hibernate的二級緩存之後查詢數據,Session對象會首先在以及緩存中查找有無緩存數據被命中。如果沒有,則查找二級緩存。如果有,則直接返回所命中的數據;否則查詢資料庫。

『陸』 誰能幫我解釋下Hibernate 一級緩存 二級緩存 以及查詢緩存

一級緩存
為session級別的緩存,為
hibernate
內置緩存,你從資料庫load或get數據的時候會先去一級緩存上找。如果找到,則不會從資料庫中存,否則從資料庫中取。一級緩存會在session關閉時自動清除。
二級緩存為
SessionFactory
級別的緩存,要使用第三方二級緩存組件,不同session可以共享二級緩存中的數據!
查詢緩存就是hql或
sql語句
要相同,否則無法命中數據

『柒』 hibernate怎麼實現緩存

一、why(為什麼要用Hibernate緩存?)

Hibernate是一個持久層框架,經常訪問物理資料庫。

為了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。

緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。

二、what(Hibernate緩存原理是怎樣的?)Hibernate緩存包括兩大類:Hibernate一級緩存和Hibernate二級緩存。

1.Hibernate一級緩存又稱為「Session的緩存」。

Session內置不能被卸載,Session的緩存是事務范圍的緩存(Session對象的生命周期通常對應一個資料庫事務或者一個應用事務)。

一級緩存中,持久化類的每個實例都具有唯一的OID。

2.Hibernate二級緩存又稱為「SessionFactory的緩存」。

由於SessionFactory對象的生命周期和應用程序的整個過程對應,因此Hibernate二級緩存是進程范圍或者集群范圍的緩存,有可能出現並發問題,因此需要採用適當的並發訪問策略,該策略為被緩存的數據提供了事務隔離級別。

第二級緩存是可選的,是一個可配置的插件,默認下SessionFactory不會啟用這個插件。

Hibernate提供了org.hibernate.cache.CacheProvider介面,它充當緩存插件與Hibernate之間的適配器。

什麼樣的數據適合存放到第二級緩存中?
1) 很少被修改的數據
2) 不是很重要的數據,允許出現偶爾並發的數據
3) 不會被並發訪問的數據
4) 常量數據
不適合存放到第二級緩存的數據?
1) 經常被修改的數據
2) 絕對不允許出現並發訪問的數據,如財務數據,絕對不允許出現並發
3) 與其他應用共享的數據。

3.Session的延遲載入實現要解決兩個問題:正常關閉連接和確保請求中訪問的是同一個session。

Hibernate session就是java.sql.Connection的一層高級封裝,一個session對應了一個Connection。

http請求結束後正確的關閉session(過濾器實現了session的正常關閉);延遲載入必須保證是同一個session(session綁定在ThreadLocal)。

4.Hibernate查找對象如何應用緩存?
當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;

查不到,如果配置了二級緩存,那麼從二級緩存中查;

如果都查不到,再查詢資料庫,把結果按照ID放入到緩存刪除、更新、增加數據的時候,同時更新緩存。

5.一級緩存與二級緩存的對比圖。

一級緩存

二級緩存

存放數據的形式

相互關聯的持久化對象

對象的散裝數據

緩存的范圍

事務范圍,每個事務都擁有單獨的一級緩存

進程范圍或集群范圍,緩存被同一個進程或集群范圍內所有事務共享

並發訪問策略

由於每個事務都擁有單獨的一級緩存不會出現並發問題,因此無須提供並發訪問策略

由於多個事務會同時訪問二級緩存中的相同數據,因此必須提供適當的並發訪問策略,來保證特定的事務隔離級別

數據過期策略

處於一級緩存中的對象永遠不會過期,除非應用程序顯示清空或者清空特定對象

必須提供數據過期策略,如基於內存的緩存中對象的最大數目,允許對象處於緩存中的最長時間,以及允許對象處於緩存中的最長空閑時間

物理介質

內存

內存和硬碟,對象的散裝數據首先存放到基於內存的緩存中,當內存中對象的數目達到數據過期策略的maxElementsInMemory值,就會把其餘的對象寫入基於硬碟的緩存中

緩存軟體實現

在Hibernate的Session的實現中包含

由第三方提供,Hibernate僅提供了緩存適配器,用於把特定的緩存插件集成到Hibernate中

啟用緩存的方式

只要通過Session介面來執行保存,更新,刪除,載入,查詢,Hibernate就會啟用一級緩存,對於批量操作,如不希望啟用一級緩存,直接通過JDBCAPI來執行

用戶可以再單個類或類的單個集合的粒度上配置第二級緩存,如果類的實例被經常讀,但很少被修改,就可以考慮使用二級緩存,只有為某個類或集合配置了二級緩存,Hibernate在運行時才會把它的實例加入到二級緩存中

用戶管理緩存的方式

一級緩存的物理介質為內存,由於內存的容量有限,必須通過恰當的檢索策略和檢索方式來限制載入對象的數目,Session的evit()方法可以顯示的清空緩存中特定對象,但不推薦

二級緩存的物理介質可以使內存和硬碟,因此第二級緩存可以存放大容量的數據,數據
過期策略的maxElementsInMemory屬性可以控制內存中的對象數目,管理二級緩存主要包括兩個方面:選擇需要使用第二級緩存的持久化類,設
置合適的並發訪問策略;選擇緩存適配器,設置合適的數據過期策略。SessionFactory的evit()方法也可以顯示的清空緩存中特定對象,但不
推薦

三、how(Hibernate的緩存機制如何應用?)

1. 一級緩存的管理:

evit(Object obj) 將指定的持久化對象從一級緩存中清除,釋放對象所佔用的內存資源,指定對象從持久化狀態變為脫管狀態,從而成為游離對象。

clear() 將一級緩存中的所有持久化對象清除,釋放其佔用的內存資源。

contains(Object obj) 判斷指定的對象是否存在於一級緩存中。

flush() 刷新一級緩存區的內容,使之與資料庫數據保持同步。

2.一級緩存應用: save()。當session對象調用save()方法保存一個對象後,該對象會被放入到session的緩存中。
get()和load()。當session對象調用get()或load()方法從資料庫取出一個對象後,該對象也會被放入到session的緩存中。
使用HQL和QBC等從資料庫中查詢數據。

public class Client
{
public static void main(String[] args)
{
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx = null;
try
{
/*開啟一個事務*/
tx = session.beginTransaction();
/*從資料庫中獲取id=""的Customer對象*/
Customer customer1 = (Customer)session.get(Customer.class, "");
System.out.println("customer.getUsername is"+customer1.getUsername());
/*事務提交*/
tx.commit();

System.out.println("-------------------------------------");

/*開啟一個新事務*/
tx = session.beginTransaction();
/*從資料庫中獲取id=""的Customer對象*/
Customer customer2 = (Customer)session.get(Customer.class, "");
System.out.println("customer2.getUsername is"+customer2.getUsername());
/*事務提交*/
tx.commit();

System.out.println("-------------------------------------");

/*比較兩個get()方法獲取的對象是否是同一個對象*/
System.out.println("customer1 == customer2 result is "+(customer1==customer2));
}
catch (Exception e)
{
if(tx!=null)
{
tx.rollback();
}
}
finally
{
session.close();
}
}
}

結果
Hibernate:
select
customer0_.id as id0_0_,
customer0_.username as username0_0_,
customer0_.balance as balance0_0_
from
customer customer0_
where
customer0_.id=?
customer.getUsername islisi
-------------------------------------
customer2.getUsername islisi
-------------------------------------
customer1 == customer2 result is true

輸出結果中只包含了一條SELECT SQL語句,而且customer1 == customer2 result is
true說明兩個取出來的對象是同一個對象。其原理是:第一次調用get()方法,
Hibernate先檢索緩存中是否有該查找對象,發現沒有,Hibernate發送SELECT語句到資料庫中取出相應的對象,然後將該對象放入緩存
中,以便下次使用,第二次調用get()方法,Hibernate先檢索緩存中是否有該查找對象,發現正好有該查找對象,就從緩存中取出來,不再去資料庫
中檢索。

3.二級緩存的管理:

evict(Class arg0, Serializable arg1)將某個類的指定ID的持久化對象從二級緩存中清除,釋放對象所佔用的資源。

sessionFactory.evict(Customer.class, new Integer(1));

evict(Class arg0) 將指定類的所有持久化對象從二級緩存中清除,釋放其佔用的內存資源。

sessionFactory.evict(Customer.class);

evictCollection(String arg0) 將指定類的所有持久化對象的指定集合從二級緩存中清除,釋放其佔用的內存資源。

sessionFactory.evictCollection("Customer.orders");

4.二級緩存的配置

常用的二級緩存插件

EHCache org.hibernate.cache.EhCacheProvider

OSCache org.hibernate.cache.OSCacheProvider

SwarmCahe org.hibernate.cache.SwarmCacheProvider

JBossCache org.hibernate.cache.TreeCacheProvider

<!-- EHCache的配置,hibernate.cfg.xml -->
<hibernate-configuration>
<session-factory>
<!-- 設置二級緩存插件EHCache的Provider類-->
<property name="hibernate.cache.provider_class">
org.hibernate.cache.EhCacheProvider
</property>
<!-- 啟動"查詢緩存" -->
<property name="hibernate.cache.use_query_cache">
true
</property>
</session-factory>
</hibernate-configuration>

<!-- ehcache.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!--
緩存到硬碟的路徑
-->
<diskStore path="d:/ehcache"></diskStore>
<!--
默認設置
maxElementsInMemory : 在內存中最大緩存的對象數量。
eternal : 緩存的對象是否永遠不變。
timeToIdleSeconds :可以操作對象的時間。
timeToLiveSeconds :緩存中對象的生命周期,時間到後查詢數據會從資料庫中讀取。
overflowToDisk :內存滿了,是否要緩存到硬碟。
-->
<defaultCache maxElementsInMemory="200" eternal="false"
timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true"></defaultCache>
<!--
指定緩存的對象。
下面出現的的屬性覆蓋上面出現的,沒出現的繼承上面的。
-->
<cache name="com.suxiaolei.hibernate.pojos.Order" maxElementsInMemory="200" eternal="false"
timeToIdleSeconds="50" timeToLiveSeconds="60" overflowToDisk="true"></cache>
</ehcache>

<!-- *.hbm.xml -->
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping>
<class>
<!-- 設置該持久化類的二級緩存並發訪問策略 read-only read-write nonstrict-read-write transactional-->
<cache usage="read-write"/>
</class>
</hibernate-mapping>

若存在一對多的關系,想要在在獲取一方的時候將關聯的多方緩存起來,需要在集合屬性下添加<cache>子標簽,這里需要將關聯的對象的hbm文件中必須在存在<class>標簽下也添加<cache>標簽,不然Hibernate只會緩存OID。

<hibernate-mapping>
<class name="com.suxiaolei.hibernate.pojos.Customer" table="customer">
<!-- 主鍵設置 -->
<id name="id" type="string">
<column name="id"></column>
<generator class="uuid"></generator>
</id>

<!-- 屬性設置 -->
<property name="username" column="username" type="string"></property>
<property name="balance" column="balance" type="integer"></property>

<set name="orders" inverse="true" cascade="all" lazy="false" fetch="join">
<cache usage="read-only"/>
<key column="customer_id" ></key>
<one-to-many class="com.suxiaolei.hibernate.pojos.Order"/>
</set>

</class>
</hibernate-mapping>

『捌』 什麼是hibernate緩存機制

這是面試中經常問到的一個問題,樓主可以按照我的思路回答,准你回答得很完美,首先說下Hibernate緩存的作用(即為什麼要用緩存機制),然後再具體說說Hibernate中緩存的分類情況,
最後可以舉個具體的例子。
Hibernate緩存的作用:
Hibernate是一個持久層框架,經常訪問物理資料庫,為了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據
Hibernate緩存分類:
Hibernate緩存包括兩大類:Hibernate一級緩存和Hibernate二級緩存
Hibernate一級緩存又稱為「Session的緩存」,它是內置的,不能被卸載(不能被卸載的意思就是這種緩存不具有可選性,必須有的功能,不可以取消session緩存)。由於Session對象的生命周期通常對應一個資料庫事務或者一個應用事務,因此它的緩存是事務范圍的緩存。第一級緩存是必需的,不允許而且事實上也無法卸除。在第一級緩存中,持久化類的每個實例都具有唯一的OID。
Hibernate二級緩存又稱為「SessionFactory的緩存」,由於SessionFactory對象的生命周期和應用程序的整個過程對應,因此Hibernate二級緩存是進程范圍或者集群范圍的緩存,有可能出現並發問題,因此需要採用適當的並發訪問策略,該策略為被緩存的數據提供了事務隔離級別。第二級緩存是可選的,是一個可配置的插件,在默認情況下,SessionFactory不會啟用這個插件。

什麼樣的數據適合存放到第二級緩存中?
1 很少被修改的數據
2 不是很重要的數據,允許出現偶爾並發的數據
3 不會被並發訪問的數據
4 常量數據
不適合存放到第二級緩存的數據?
1經常被修改的數據
2 .絕對不允許出現並發訪問的數據,如財務數據,絕對不允許出現並發
3 與其他應用共享的數據。

Hibernate查找對象如何應用緩存?
當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;如果都查不到,再查詢資料庫,把結果按照ID放入到緩存
刪除、更新、增加數據的時候,同時更新緩存

Hibernate管理緩存實例
無論何時,我們在管理Hibernate緩存(Managing the caches)時,當你給save()、update()或saveOrUpdate()方法傳遞一個對象時,或使用load()、 get()、list()、iterate() 或scroll()方法獲得一個對象時, 該對象都將被加入到Session的內部緩存中。
當隨後flush()方法被調用時,對象的狀態會和資料庫取得同步。 如果你不希望此同步操作發生,或者你正處理大量對象、需要對有效管理內存時,你可以調用evict() 方法,從一級緩存中去掉這些對象及其集合。

這樣從頭到尾一說的話,很全很詳細,估計面試官對你的印象很好。不過也不要面面俱到,樓主可以挑一些自己懂得的內容說,不是很懂的內容可以省略,免得出漏子。

『玖』 什麼是hibernate的二級緩存

在向大家詳細介紹Hibernate二級緩存之前,首先讓大家了解下一級緩存,然後全面介紹Hibernate二級緩存。

Hibernate中提供了兩級Cache,第一級別的緩存是Session級別的緩存,它是屬於事務范圍的緩存。這一級別的緩存由hibernate管理的,一般情況下無需進行干預;第二級別的緩存是SessionFactory級別的緩存,它是屬於進程范圍或群集范圍的緩存。這一級別的緩存可以進行配置和更改,並且可以動態載入和卸載。 Hibernate還為查詢結果提供了一個查詢緩存,它依賴於第二級緩存。

一. 一級緩存和二級緩存的比較:

第一級緩存 第二級緩存 存放數據的形式相互關聯的持久化對象 對象的散裝數據 緩存的范圍事務范圍,每個事務都有單獨的第一級緩存進程范圍或集群范圍,緩存被同一個進程或集群范圍內的所有事務共享並發訪問策略由於每個事務都擁有單獨的第一級緩存,不會出現並發問題,無需提供並發訪問策略由於多個事務會同時訪問第二級緩存中相同數據,因此必須提供適當的並發訪問策略,來保證特定的事務隔離級別數據過期策略沒有提供數據過期策略。處於一級緩存中的對象永遠不會過期,除非應用程序顯式清空緩存或者清除特定的對象必須提供數據過期策略,如基於內存的緩存中的對象的最大數目,允許對象處於緩存中的最長時間,以及允許對象處於緩存中的最長空閑時間物理存儲介質內存內存和硬碟。對象的散裝數據首先存放在基於內存的緩存中,當內存中對象的數目達到數據過期策略中指定上限時,就會把其餘的對象寫入基於硬碟的緩存中。緩存的軟體實現在Hibernate的Session的實現中包含了緩存的實現由第三方提供,Hibernate僅提供了緩存適配器(CacheProvider)。用於把特定的緩存插件集成到Hibernate中。啟用緩存的方式只要應用程序通過Session介面來執行保存、更新、刪除、載入和查詢資料庫數據的操作,Hibernate就會啟用第一級緩存,把資料庫中的數據以對象的形式拷貝到緩存中,對於批量更新和批量刪除操作,如果不希望啟用第一級緩存,可以繞過Hibernate API,直接通過JDBC API來執行指操作。用戶可以在單個類或類的單個集合的粒度上配置第二級緩存。如果類的實例被經常讀但很少被修改,就可以考慮使用第二級緩存。只有為某個類或集合配置了第二級緩存,Hibernate在運行時才會把它的實例加入到第二級緩存中。用戶管理緩存的方式第一級緩存的物理介質為內存,由於內存容量有限,必須通過恰當的檢索策略和檢索方式來限制載入對象的數目。Session的 evit()方法可以顯式清空緩存中特定對象,但這種方法不值得推薦。第二級緩存的物理介質可以是內存和硬碟,因此第二級緩存可以存放大量的數據,數據過期策略的maxElementsInMemory屬性值可以控制內存中的對象數目。管理第二級緩存主要包括兩個方面:選擇需要使用第二級緩存的持久類,設置合適的並發訪問策略:選擇緩存適配器,設置合適的數據過期策略。

二. 一級緩存的管理:

當應用程序調用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調用查詢介面的 list()、iterate()或filter()方法時,如果在Session緩存中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩存中。當清理緩存時,Hibernate會根據緩存中對象的狀態變化來同步更新資料庫。 Session為應用程序提供了兩個管理緩存的方法: evict(Object obj):從緩存中清除參數指定的持久化對象。 clear():清空緩存中所有持久化對象。

三. Hibernate二級緩存的管理:

1. Hibernate二級緩存策略的一般過程如下:
1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的數據對象。
2) 把獲得的所有數據對象根據ID放入到第二級緩存中。
3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢資料庫,把結果按照ID放入到緩存。
4) 刪除、更新、增加數據的時候,同時更新緩存。
Hibernate二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。

2. 什麼樣的數據適合存放到第二級緩存中?
1) 很少被修改的數據
2) 不是很重要的數據,允許出現偶爾並發的數據
3) 不會被並發訪問的數據
4) 參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。

3. 不適合存放到第二級緩存的數據?
1) 經常被修改的數據
2) 財務數據,絕對不允許出現並發
3) 與其他應用共享的數據。

4. 常用的緩存插件 Hibernater二級緩存是一個插件,下面是幾種常用的緩存插件:
◆EhCache:可作為進程范圍的緩存,存放數據的物理介質可以是內存或硬碟,對Hibernate的查詢緩存提供了支持。
◆OSCache:可作為進程范圍的緩存,存放數據的物理介質可以是內存或硬碟,提供了豐富的緩存數據過期策略,對Hibernate的查詢緩存提供了支持。
◆SwarmCache:可作為群集范圍內的緩存,但不支持Hibernate的查詢緩存。
◆JBossCache:可作為群集范圍內的緩存,支持事務型並發訪問策略,對Hibernate的查詢緩存提供了支持。

5. 配置Hibernate二級緩存的主要步驟:
1) 選擇需要使用二級緩存的持久化類,設置它的命名緩存的並發訪問策略。這是最值得認真考慮的步驟。
2) 選擇合適的緩存插件,然後編輯該插件的配置文件。

熱點內容
我的世界如何加入伺服器小游戲 發布:2024-10-13 00:14:27 瀏覽:152
解壓菜蛋糕 發布:2024-10-12 23:46:49 瀏覽:8
手機qq鎖上密碼如何解鎖 發布:2024-10-12 23:36:24 瀏覽:463
壓縮機固定架 發布:2024-10-12 23:34:12 瀏覽:664
linux內核有多少行代碼 發布:2024-10-12 23:30:03 瀏覽:230
qq源碼資源網 發布:2024-10-12 23:23:52 瀏覽:20
為什麼web伺服器沒有對應的站點 發布:2024-10-12 22:55:46 瀏覽:780
安卓手機在哪裡下游戲 發布:2024-10-12 22:54:08 瀏覽:406
財年演算法問題 發布:2024-10-12 22:51:50 瀏覽:314
sql最近的 發布:2024-10-12 22:51:38 瀏覽:335