Hibernate緩存分類,范圍及管理配置
緩存是位于應(yīng)用程序與物理數(shù)據(jù)源之間,用于臨時存放復(fù)制數(shù)據(jù)的內(nèi)存區(qū)域,目的是為了減少應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源訪問的次數(shù),從而提高應(yīng)用程序的運行性能.
Hibernate在查詢數(shù)據(jù)時,首先到緩存中去查找,如果找到就直接使用,找不到的時候就會從物理數(shù)據(jù)源中檢索,所以,把頻繁使用的數(shù)據(jù)加載到緩存區(qū)后,就可以大大減少應(yīng)用程序?qū)ξ锢頂?shù)據(jù)源的訪問,使得程序的運行性能明顯的提升.
Hibernate緩存分類:
Session緩存,一級緩存.
SessionFactory的緩存分為內(nèi)置緩存和外置緩存.內(nèi)置緩存中存放的是SessionFactory對象的一些集合屬性包含的數(shù)據(jù)(映射元素?fù)?jù)及預(yù)定義SQL語句等),對于應(yīng)用程序來說,它是只讀的.外置緩存中存放的是數(shù)據(jù)庫數(shù)據(jù)的副本,其作用和一級緩存類似.二級緩存除了以內(nèi)存作為存儲介質(zhì)外,還可以選用硬盤等外部存儲設(shè)備.
Hibernate的緩存范圍
Hibernate的一級緩存和二級緩存都位于均位于持久層,且均用于存放數(shù)據(jù)庫數(shù)據(jù)的副本,最大的區(qū)別就是緩存的范圍各不一樣.
緩存的范圍分為3類:
1.事務(wù)范圍
事務(wù)范圍的緩存只能被當(dāng)前事務(wù)訪問,每個事務(wù)都有各自的緩存,緩存內(nèi)的數(shù)據(jù)通常采用相互關(guān)聯(lián)的對象形式.緩存的生命周期依賴于事務(wù)的生命周期,只有當(dāng)事務(wù)結(jié)束時,緩存的生命周期才會結(jié)束.事務(wù)范圍的緩存使用內(nèi)存作為存儲介質(zhì),一級緩存就屬于事務(wù)范圍.
2.應(yīng)用范圍
應(yīng)用程序的緩存可以被應(yīng)用范圍內(nèi)的所有事務(wù)共享訪問.緩存的生命周期依賴于應(yīng)用的生命周期,只有當(dāng)應(yīng)用結(jié)束時,緩存的生命周期才會結(jié)束.應(yīng)用范圍的緩存可以使用內(nèi)存或硬盤作為存儲介質(zhì),二級緩存就屬于應(yīng)用范圍.
3.集群范圍
在集群環(huán)境中,緩存被一個機器或多個機器的進程共享,緩存中的數(shù)據(jù)被復(fù)制到集群環(huán)境中的每個進程節(jié)點,進程間通過遠(yuǎn)程通信來保證緩存中的數(shù)據(jù)的一致,緩存中的數(shù)據(jù)通常采用對象的松散數(shù)據(jù)形式.
Hibernate緩存管理
一級緩存的管理:
evit(Object obj) 將指定的持久化對象從一級緩存中清除,釋放對象所占用的內(nèi)存資源,指定對象從持久化狀態(tài)變?yōu)槊摴軤顟B(tài),從而成為游離對象.
clear() 將一級緩存中的所有持久化對象清除,釋放其占用的內(nèi)存資源
contains(Object obj) 判斷指定的對象是否存在于一級緩存中.
flush() 刷新一級緩存區(qū)的內(nèi)容,使之與數(shù)據(jù)庫數(shù)據(jù)保持同步.
二級緩存的管理:
evict(Class arg0, Serializable arg1) 將某個類的指定ID的持久化對象從二級緩存中清除,釋放對象所占用的資源.
- sessionFactory.evict(Customer.class, new Integer(1));
- sessionFactory.evict(Customer.class, new Integer(1));
evict(Class arg0) 將指定類的所有持久化對象從二級緩存中清除,釋放其占用的內(nèi)存資源.
- sessionFactory.evict(Customer.class);
- sessionFactory.evict(Customer.class);
evictCollection(String arg0) 將指定類的所有持久化對象的指定集合從二級緩存中清除,釋放其占用的內(nèi)存資源.
- sessionFactory.evictCollection("Customer.orders");
- sessionFactory.evictCollection("Customer.orders");
Hibernate的二級緩存的配置
首先,不是所有的數(shù)據(jù)都適合放在二級緩存中,看一下,什么樣的數(shù)據(jù)適合放在二級緩存中來?什么樣的數(shù)據(jù)不適合放在二級緩存中來?
下面這幾種情況就不適合加載到二級緩存中:
1.經(jīng)常被修改的數(shù)據(jù)
2.絕對不允許出現(xiàn)并發(fā)訪問的數(shù)據(jù)
3.與其他應(yīng)用共享的數(shù)據(jù)
下面這己種情況合適加載到二級緩存中:
1.數(shù)據(jù)更新頻率低
2.允許偶爾出現(xiàn)并發(fā)問題的非重要數(shù)據(jù)
3.不會被并發(fā)訪問的數(shù)據(jù)
4.常量數(shù)據(jù)
5.不會被第三方修改的數(shù)據(jù)
Hibernate的二級緩存功能是靠配置二級緩存插件來實現(xiàn)的,Hibernate為了集成這些插件,Hibernate提供了org.hibernate.cache.CacheProvider借口,它充當(dāng)緩存插件與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
- < hibernate-configuration>
- < session-factory>
- < !-- 設(shè)置二級緩存插件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>
- < !-- 設(shè)置二級緩存插件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
- < ehcache>
- < !-- maxElementsInMemory為緩存對象的最大數(shù)目, eternal設(shè)置是否永遠(yuǎn)不過期,timeToIdleSeconds對象處于空閑狀態(tài)的最多秒數(shù),timeToLiveSeconds對象處于緩存狀態(tài)的最多秒數(shù) -->
- < diskStore path="java.io.tmpdir"/>
- < defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>
- < /ehcache>
- < ehcache>
- < !-- maxElementsInMemory為緩存對象的最大數(shù)目, eternal設(shè)置是否永遠(yuǎn)不過期,timeToIdleSeconds對象處于空閑狀態(tài)的最多秒數(shù),timeToLiveSeconds對象處于緩存狀態(tài)的最多秒數(shù) -->
- < diskStore path="java.io.tmpdir"/>
- < defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="true"/>
- < /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>
- < !-- 設(shè)置該持久化類的二級緩存并發(fā)訪問策略 read-only read-write nonstrict-read-write transactional-->
- < cache usage="read-write"/>
- < /class>
- < /hibernate-mapping>
【編輯推薦】