hibernate 5的二級緩存案例講解


本帖最后由 魚丸兒 於 2018-1-20 11:44 編輯

大家好,今天來記錄講解一下磕磕絆絆的hibernate5 的二級緩存配置,一條路摸到黑 
那么在這之前我們先了解一下hibernate的一級緩存和二級緩存分別是什么? 
說句通俗的話就是 一級緩存的信息只能在同一個session間傳遞,而二級緩存是不同的session間可以訪問的,可以跨越Session存在,可以被多個Session所共享。需要第三方緩存框架的加持 

那么什么數據適合放到二級緩存中呢? 
便是那些不經常改動又經常被訪問的數據,比如省市信息等,前台頁面經常查詢而沒必要每次都要去數據庫查詢! 

那么有什么三方框架可以支持hibernate的二級緩存呢?
 
EHCache: 可作為進程范圍內的緩存,存放數據的物理介質可以是內存或硬盤,對Hibernate的查詢緩存提供了支持 
OpenSymphony:可作為進程范圍內的緩存,存放數據的物理介質可以是內存或硬盤,提供了豐富的緩存數據過期策略,對Hibernate的查詢緩存提供了支持 
SwarmCache:可作為集群范圍內的緩存,但不支持Hibernate的查詢緩存 
JBossCache:可作為集群范圍內的緩存,支持Hibernate的查詢緩存 

好,那么我們接下來就以EHCache來介紹一下hibernate二級緩存的用法 

第一步:導入jar包(jar包附件給出) 
[Java]  純文本查看 復制代碼
?
1
2
3
ehcache-core- 2.4 . 3 .jar 
hibernate-ehcache- 5.0 . 7 .Final.jar 
commons-logging- 1.1 . 1 .jar


第二步:聲明緩存(在hibernate.cfg.xml 中配置) 
[XML]  純文本查看 復制代碼
?
1
2
3
4
5
6
7
<!-- 使用二級緩存 --> 
< property name = "hibernate.cache.use_second_level_cache" >true</ property
<!--設置緩存的類型,設置緩存的提供商 --> 
< property name = "hibernate.cache.region.factory_class" >org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</ property
<!--但是在 hibernate 4中設置緩存提供商時是這樣設置的 
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>--> 
< property name = "hibernate.cache.use_query_cache" >true</ property >


第三步:需要設置EHCache配置文件 
[XML]  純文本查看 復制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
< ehcache xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation = "../config/ehcache.xsd" 
   
  < diskStore path = "C:/ehcache" /> <!-- 需要在你的磁盤里面添加該目錄 --> 
          < defaultCache     
             maxElementsInMemory = "10000"  
             eternal = "false"   
             timeToIdleSeconds = "120"  
             timeToLiveSeconds = "120"  
             overflowToDisk = "true"  
             maxElementsOnDisk = "10000000"  
             diskExpiryThreadIntervalSeconds = "120"   
             memoryStoreEvictionPolicy = "LRU"    
             />   
</ ehcache >


第四步:指定什么對象也就是model可以加入緩存 
有兩種配置方式,可以在hbm中創建安,也可以在cfg文件中創建 
我們這里就以cfg文件配置為例 

[XML]  純文本查看 復制代碼
?
1
2
3
4
< class-cache usage = "read-write" class = "cn.patronli.domain.Order" /> <!-緩存的是對象- 
< collection-cache usage = "read-write" collection = "cn.patronli.domain.Customer.orders" /> <!-緩存的是集合- 
   
為了保險起見 我們需要給相對應的model  實現一個序列化接口 implements Serializable


那么如何在hbm中設置呢?需要再class后緊跟緩存配置,如下所示 
[XML]  純文本查看 復制代碼
?
1
2
< class name = "Customer" table = "t_customer" catalog = "hibernateTest" lazy = "true"
     < cache usage = "read-write" />


以上配置二選一 !!!! 

那么最后我們就可以來進行測試了 
[Java]  純文本查看 復制代碼
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
public static void main(String[] args) {   
             
         Session s1 = HibernateUtils.openSession(); 
         s1.beginTransaction();   
         Customer c1 = (Customer) s1.get(Customer. class , 1 ); // 從數據庫中加載數據   
         System.out.println(c1.getName()); 
         s1.getTransaction().commit();   
         s1.close(); // 關閉session級別的一級緩存   
     
         Session s2 = HibernateUtils.openSession(); 
         s2.beginTransaction();   
         Customer c2 = (Customer) s2.get(Customer. class , 1 ); // 因為有了二級緩存的存在,並不會去查詢數據庫可以debug  觀察控制台打印 
         System.out.println(c2.getName());   
     }


不知道你學會了沒有?


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM