首頁 >Java >java教程 >有關hibernate快取機制介紹

有關hibernate快取機制介紹

巴扎黑
巴扎黑原創
2017-07-17 17:52:491847瀏覽

hibernate一級快取

1.Hibernate一級快取又稱為“Session快取”,“會話級快取”。

2.透過Session從資料庫查詢實體時會把實體在記憶體中儲存起來,下一次查詢同一實體時不再從資料庫獲取,而是從記憶體中獲取,這就是快取

#3.一級快取的生命週期和Session相同,Session銷毀,它也銷毀。

4.一級快取中的資料可適用範圍在目前會話之內。

 

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) 與其他應用共享的數據。


#管理第一層快取的API

1.evict(),用於將某個物件從Session的一級快取中清除。

2.clear(),用於將一級快取中的所有物件全部清除。

 

Qurey.list()和Qurey.iterate()

1.Qurey.list()查詢數據,不會從一級快取中查找,直接向資料庫傳送sql語句,將查詢傳回的物件保留在快取中。

2.Qurey.iterate()不從一級快取中找,直接向資料庫發送sql,查詢id,當需要使用對像其他屬性的時候,先在快取中根據id查找對象,如果沒有則向資料庫傳送sql查詢,因此單獨用該方法查詢會產生N+1問題(即向資料庫傳送N+1條語句查詢N個物件的資訊)

3.如果存在這種需求:在兩個不同的session都需要對相同的物件進行訪問,透過Qurey.list()需要發送兩個sql語句甚至更多,為了避免可以設定二級緩存,在第一個session中Query.list() ,在第二個session中直接透過Qurey.iterate()迭代從二級快取中取得

 

hibernate二級快取(SessionFactory快取)

1.新增在hibernate.cfg.xml裡面的設定

        <!-- 开启二级缓存 --><property name="hibernate.cache.use_second_level_cache">true</property><!-- 二级缓存的提供类 在hibernate4.0版本以后我们都是配置这个属性来指定二级缓存的提供类--><property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property><!-- 二级缓存配置文件的位置 --><property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>

2.設定ehcache.xml具體見 

#3.透過註解配置entity,在類別前加上@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)

 CacheConcurrencyStrategy屬性值常見的有READ_ONLY((對該entity對應的資料表資料只讀取然後快取)和READ-WIRTE(對錶資料可以讀取也可以更新)

4,一定要注意:hibernate二級快取的必須是整個對象,如果查詢的只是物件某些屬性,那麼該物件不會被快取

 

查詢快取(SessionFactory級快取) 

1.在上述二級快取的基礎上繼續配置

2.在hibernate.cfg.xml中新增配置

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

2.在entity註解上新增@Cacheable

3.在hql語句後面要呼叫setCacheable(true)方法

4.只有當HQL 查詢語句完全相同時,連參數設定都要相同,此時查詢快取才有效

 

hibernate的三種狀態(transient(瞬時狀態),persistent(持久化狀態)以及detached(離線狀態))


 

#

以上是有關hibernate快取機制介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn