緩存是位於應用程序與物理數據源之間用於臨時存放復制數據的內存區域目的是為了減少應用程序對物理數據源訪問的次數從而提高應用程序的運行性能
Hibernate在查詢數據時首先到緩存中去查找如果找到就直接使用找不到的時候就會從物理數據源中檢索所以把頻繁使用的數據加載到緩存區後就可以大大減少應用程序對物理數據源的訪問使得程序的運行性能明顯的提升
Hibernate緩存分類
Session緩存一級緩存
SessionFactory的緩存分為內置緩存和外置緩存內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據及預定義SQL語句等)對於應用程序來說它是只讀的外置緩存中存放的是數據庫數據的副本其作用和一級緩存類似二級緩存除了以內存作為存儲介質外還可以選用硬盤等外部存儲設備
Hibernate的緩存范圍
Hibernate的一級緩存和二級緩存都位於均位於持久層且均用於存放數據庫數據的副本最大的區別就是緩存的范圍各不一樣
緩存的范圍分為類:
事務范圍
事務范圍的緩存只能被當前事務訪問每個事務都有各自的緩存緩存內的數據通常采用相互關聯的對象形式緩存的生命周期依賴於事務的生命周期只有當事務結束時緩存的生命周期才會結束事務范圍的緩存使用內存作為存儲介質一級緩存就屬於事務范圍
應用范圍
應用程序的緩存可以被應用范圍內的所有事務共享訪問緩存的生命周期依賴於應用的生命周期只有當應用結束時緩存的生命周期才會結束應用范圍的緩存可以使用內存或硬盤作為存儲介質二級緩存就屬於應用范圍
集群范圍
在集群環境中緩存被一個機器或多個機器的進程共享緩存中的數據被復制到集群環境中的每個進程節點進程間通過遠程通信來保證緩存中的數據的一致緩存中的數據通常采用對象的松散數據形式
Hibernate的緩存管理
一級緩存的管理:
evit(Object obj) 將指定的持久化對象從一級緩存中清除釋放對象所占用的內存資源指定對象從持久化狀態變為脫管狀態從而成為游離對象
clear() 將一級緩存中的所有持久化對象清除釋放其占用的內存資源
contains(Object obj) 判斷指定的對象是否存在於一級緩存中
flush() 刷新一級緩存區的內容使之與數據庫數據保持同步
二級緩存的管理:
evict(Class arg Serializable arg) 將某個類的指定ID的持久化對象從二級緩存中清除釋放對象所占用的資源
Java代碼
sessionFactoryevict(Customerclass new Integer());
evict(Class arg) 將指定類的所有持久化對象從二級緩存中清除釋放其占用的內存資源
Java代碼
sessionFactoryevict(Customerclass);
evictCollection(String arg) 將指定類的所有持久化對象的指定集合從二級緩存中清除釋放其占用的內存資源
Java代碼
sessionFactoryevictCollection(Customerorders);
Hibernate的二級緩存的配置
首先不是所有的數據都適合放在二級緩存中看一下什麼樣的數據適合放在二級緩存中來?什麼樣的數據不適合放在二級緩存中來?
下面這幾種情況就不適合加載到二級緩存中:
經常被修改的數據
絕對不允許出現並發訪問的數據
與其他應用共享的數據
下面這己種情況合適加載到二級緩存中:
數據更新頻率低
允許偶爾出現並發問題的非重要數據
不會被並發訪問的數據
常量數據
不會被第三方修改的數據
Hibernate的二級緩存功能是靠配置二級緩存插件來實現的Hibernate為了集成這些插件Hibernate提供了orghibernatecacheCacheProvider借口它充當緩存插件與Hibernate之間的適配器
常用的二級緩存插件
EHCache orghibernatecacheEhCacheProvider
OSCache orghibernatecacheOSCacheProvider
SwarmCahe orghibernatecacheSwarmCacheProvider
JBossCache orghibernatecacheTreeCacheProvider
簡單介紹一下EHCache的配置
hibernatecfgxml
Xml代碼
<hibernateconfiguration>
<sessionfactory>
<! 設置二級緩存插件EHCache的Provider類>
<property name=hibernatecacheprovider_class>
orghibernatecacheEhCacheProvider
</property>
<! 啟動查詢緩存 >
<property name=hibernatecacheuse_query_cache>
true
</property>
</sessionfactory>
</hibernateconfiguration>
ehcachexml
Xml代碼
<ehcache>
<! maxElementsInMemory為緩存對象的最大數目 eternal設置是否永遠不過期timeToIdleSeconds對象處於空閒狀態的最多秒數timeToLiveSeconds對象處於緩存狀態的最多秒數 >
<diskStore path=javaiotmpdir/>
<defaultCache maxElementsInMemory= eternal=false timeToIdleSeconds= timeToLiveSeconds= overflowToDisk=true/>
</ehcache>
****hbmxml
Xml代碼
<?xml version= encoding=UTF?>
<!DOCTYPE hibernatemapping PUBLIC
//Hibernate/Hibernate Mapping DTD //EN
mappingdtd >
<hibernatemapping>
<class>
<! 設置該持久化類的二級緩存並發訪問策略 readonly readwrite nonstrictreadwrite transactional>
<cache usage=readwrite/>
</class>
</hibernatemapping>
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28418.html