標籤: java web hibernate 緩存 代碼 分類: javawebjava
緩存是位於應用程序與物理數據源之間,用於臨時存放複製數據的內存區域,目的是爲了減小應用程序對物理數據源訪問的次數,從而提升應用程序的運行性能.web
Hibernate在查詢數據時,首先到緩存中去查找,若是找到就直接使用,找不到的時候就會從物理數據源中檢索,因此,把頻繁使用的數據加載到緩存區後,就能夠大大減小應用程序對物理數據源的訪問,使得程序的運行性能明顯的提高.數據庫
Hibernate緩存分類:緩存
Session緩存,一級緩存.session
SessionFactory的緩存分爲內置緩存和外置緩存.內置緩存中存放的是SessionFactory對象的一些集合屬性包含的數據(映射元素據 及預約義SQL語句等),對於應用程序來講,它是隻讀的.外置緩存中存放的是數據庫數據的副本,其做用和一級緩存相似.二級緩存除了之內存做爲存儲介質 外,還能夠選用硬盤等外部存儲設備.併發
Hibernate的緩存範圍app
Hibernate的一級緩存和二級緩存都位於均位於持久層,且均用於存放數據庫數據的副本,最大的區別就是緩存的範圍各不同.ide
緩存的範圍分爲3類:性能
1.事務範圍.net
事務範圍的緩存只能被當前事務訪問,每一個事務都有各自的緩存,緩存內的數據一般採用相互關聯的對象形式.緩存的生命週期依賴於事務的生命週期,只有當事務結束時,緩存的生命週期纔會結束.事務範圍的緩存使用內存做爲存儲介質,一級緩存就屬於事務範圍.
2.應用範圍
應用程序的緩存能夠被應用範圍內的全部事務共享訪問.緩存的生命週期依賴於應用的生命週期,只有當應用結束時,緩存的生命週期纔會結束.應用範圍的緩存可使用內存或硬盤做爲存儲介質,二級緩存就屬於應用範圍.
3.集羣範圍
在集羣環境中,緩存被一個機器或多個機器的進程共享,緩存中的數據被複制到集羣環境中的每一個進程節點,進程間經過遠程通訊來保證緩存中的數據的一致,緩存中的數據一般採用對象的鬆散數據形式.
Hibernate的緩存管理
一級緩存的管理:
evit(Object obj) 將指定的持久化對象從一級緩存中清除,釋放對象所佔用的內存資源,指定對象從持久化狀態變爲脫管狀態,從而成爲遊離對象.
clear() 將一級緩存中的全部持久化對象清除,釋放其佔用的內存資源
contains(Object obj) 判斷指定的對象是否存在於一級緩存中.
flush() 刷新一級緩存區的內容,使之與數據庫數據保持同步.
二級緩存的管理:
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");
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 內容以下
<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 內容以下
<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 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>