標籤:1.5.0 硬碟 width 分析 第三方 repeat gets 應用 collect
1.前言
這篇部落格再前幾篇部落格的基礎上來解說一下。Hibernate中的二級緩衝。二級緩衝是屬於SessionFactory層級的緩衝機制。
第一層級的緩衝是Session層級的緩衝,是屬於事務範圍的緩衝,由Hibernate管理,一般無需進行幹預。第二層級的緩衝是SessionFactory層級的緩衝。是屬於進程範圍的緩衝。
2.Hibernate二級緩衝
1.分類
二級緩衝也分為了兩種
內建緩衝:Hibernate內建的,不可卸載,通常在Hibernate的初始化階段,Hibernate會把映射中繼資料和提前定義的SQL語句放置到SessionFactory的緩衝中。該內建緩衝是僅僅讀的。
外置緩衝:通常說的二級緩衝也就是外置緩衝,在預設情況下SessionFactory不會啟用這個快取區外掛程式,外置緩衝中的資料是資料庫資料的複製,外置緩衝的物理介質能夠是記憶體或者硬碟。
hibernate二級緩衝的結構
2.並發訪問策略
transactional (事務型) |
僅在受管理的環境中適用 提供Repeatable Read交易隔離等級 適用常常被讀。非常少改動的資料 能夠防止髒讀和不可反覆讀的並發問題 緩衝支援事務,發生異常的時候。緩衝也可以復原 |
read-write (讀寫型) |
提供Read Committed交易隔離等級 在非叢集的環境中適用 適用常常被讀,非常少改動的資料 能夠防止髒讀 更新緩衝的時候會鎖定緩衝中的資料 |
nonstrict-read-write (非嚴格讀寫型) |
適用極少被改動,偶爾同意髒讀的資料(兩個事務同一時候改動資料的情況非常少見) 不保證緩衝和資料庫中資料的一致性 為快取資料設定非常短的到期時間,從而盡量避免髒讀 不鎖定緩衝中的資料 |
read-only (僅僅讀型) |
適用從來不會被改動的資料(如參考資料) 在此模式下,假設對資料進行更新操作,會有異常 交易隔離等級低,並發效能高 在叢集環境中也能完美運作 |
分析:通過上述表格分析例如以下
適合放入二級緩衝中資料
非常少被改動
不是非常重要的資料。同意出現偶爾的並發問題
不適合放入二級緩衝中的資料
常常被改動
財務資料,絕對不同意出現並發問題
與其它應用資料共用的資料
3.二級緩衝的配置
1.hibernate支援的快取區外掛程式
?EHCache: 可作為進程範圍內的緩衝,存放資料的物理介質能夠是記憶體或硬碟,對Hibernate的查詢快取提供了支援
?OpenSymphony`:可作為進程範圍內的緩衝,存放資料的物理介質能夠是記憶體或硬碟,提供了豐富的快取資料到期策略,對Hibernate的查詢快取提供了支援
?SwarmCache:可作為叢集範圍內的緩衝,但不支援Hibernate的查詢快取
?JBossCache:可作為叢集範圍內的緩衝,支援Hibernate的查詢快取
四種快取區外掛程式支援的並發範圍策略例如以
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >
2.二級緩衝配置
以下以ehcache緩衝為例,來講一下二級緩衝的配置
2.1 拷貝jar包
如要第三方的jar包ehcache-1.5.0.jar,而且依賴於
依賴backport-util-concurrent 和 commons-logging
2.2 在hibernate.cfg.xml中開啟二級緩衝
<propertyname="hibernate.cache.use_second_level_cache">true</property>
2.3 配置二級緩衝技術供應商
<propertyname="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
2.4 配置快取資料對象並發策略
方式一 在hbm檔案裡配置
<span style="font-family:SimSun;font-size:18px;"><class name="cn.itcast.domain.Customer" table="customers" catalog="hibernate3day4" ><!-- 類層級緩衝 --><cache usage="read-write"/><set name="orders" cascade="all-delete-orphan" inverse="true" ><!-- 關聯集合層級緩衝 --><cache usage="read-write"/></set></class></span>
方式二 在cfg檔案配置(集中配置)
<span style="font-family:SimSun;font-size:18px;"><!-- 類層級緩衝 --><class-cache usage="read-write" class="cn.itcast.domain.Customer"/><class-cache usage="read-write" class="cn.itcast.domain.Order"/><!-- 集合緩衝 --><collection-cache usage="read-write" collection="cn.itcast.domain.Customer.orders"/></span>
2.5 加入二級緩衝設定檔
在src中配置ehcache.xml,將ehcache.jar包中的ehcache-failsafe.xml 改名 ehcache.xml 放入 src
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="java.io.tmpdir"/> 配置二級緩衝硬碟暫時檔案夾位置 <defaultCache maxElementsInMemory="10000" // 記憶體中最大對象數量 ,超過數量。資料會被緩衝到硬碟 eternal="false" timeToIdleSeconds="120" // 是否緩衝為永久性 false 不永久 timeToLiveSeconds="120" // 存活時間。對象無論是否使用,到了時間回收 overflowToDisk="true" // 能否夠緩衝到硬碟 maxElementsOnDisk="10000000" // 硬碟緩衝最大對象數量 // 當jvm結束時是否持久化對象 true false 預設是false diskExpiryThreadIntervalSeconds="120" // 指定專門用於清除到期對象的監聽線程的輪詢時間 memoryStoreEvictionPolicy="LRU" /></ehcache>
4.Demo測試二級緩衝
@Testpublic void fun1() {Session s1 = HibernateUtils.getSession();s1.beginTransaction();Customer c1 = (Customer) s1.get(Customer.class, 1); // 從資料庫中載入資料System.out.println(c1.getName());//此時才會發出SQL語句s1.getTransaction().commit();s1.close(); // 關閉session層級的一級緩衝Session s2 = HibernateUtils.getSession();s2.beginTransaction();Customer c2 = (Customer) s2.get(Customer.class, 1); // 由於有了二級緩衝的存在,直接從二級緩衝中取出就可以System.out.println(c2.getName());Customer c3 = (Customer) s2.get(Customer.class, 1); //從二級緩衝中取出System.out.println(c3.getName());s2.getTransaction().commit();s2.close();}
具體解釋Hibernate中的二級緩衝