一、一級緩衝二級緩衝的概念解釋
(1)一級緩衝就是Session層級的緩衝,一個Session做了一個查詢操作,它會把這個操作的結果放在一級緩衝中。假設短時間內這個
session(一定要同一個session)又做了同一個操作。那麼hibernate直接從一級緩衝中拿,而不會再去連資料庫,取資料;
(2)二級緩衝就是SessionFactory層級的緩衝,顧名思義。就是查詢的時候會把查詢結果緩衝到二級緩衝中,假設同一個sessionFactory
建立的某個session運行了同樣的操作,hibernate就會從二級緩衝中拿結果,而不會再去串連資料庫;
(3)Hibernate中提供了兩級Cache,第一層級的緩衝是Session層級的緩衝,它是屬於事務範圍的緩衝。這一層級的緩衝由hibernate管理
的。普通情況下無需進行幹預;第二層級的緩衝是SessionFactory層級的緩衝,它是屬於進程範圍或群集範圍的緩衝。這一層級的緩
存能夠進行配置和更改,而且能夠動態載入和卸載。
Hibernate還為查詢結果提供了一個查詢快取,它依賴於第二級緩衝。
二、一級緩衝和二級緩衝的比較
(1)第一級緩衝 第二級緩衝 存放資料的形式相互關聯的持久化對象 對象的散裝資料 緩衝的範圍事務範圍。每一個事務都有單獨的第一級
緩衝進程範圍或叢集範圍。緩衝被同一個進程或叢集範圍內的全部事務共用並發訪問策略因為每一個事務都擁有單獨的第一級緩衝,不
會出現並發問題,無需提供並發訪問策略因為多個事務會同一時候訪問第二級緩衝中同樣資料。因此必須提供適當的並發訪問策略,來保
證特定的交易隔離等級資料到期策略沒有提供資料到期策略。
(2)處於一級緩衝中的對象永遠不會到期。除非應用程式顯式清空緩衝或者
清除特定的對象必須提供資料到期策略,如基於記憶體的緩衝中的對象的最大數目,同意對象處於緩衝中的最長時間。以及同意對象處
於緩衝中的最長空暇時間實體儲存體介質記憶體記憶體和硬碟。
(3)對象的散裝資料首先存放在基於記憶體的緩衝中,當記憶體中對象的數目達到數
據到期策略中指定上限時,就會把其餘的對象寫入基於硬碟的緩衝中。
(4)緩衝的軟體實如今Hibernate的Session的實現中包括了緩衝的
實現由第三方提供,Hibernate僅提供了緩衝適配器(CacheProvider)。
用於把特定的快取區外掛程式整合到Hibernate中。
(5)啟用緩衝的方式
僅僅要應用程式通過Session介面來運行儲存、更新、刪除、載入和查詢資料庫資料的操作,Hibernate就會啟用第一級緩衝。把資料庫
中的資料以對象的形式複製到緩衝中。對於批次更新和大量刪除操作。假設不希望啟用第一級緩衝,能夠繞過Hibernate API。直接
通過JDBC API來運行指操作。
(6)使用者能夠在單個類或類的單個集合的粒度上配置第二級緩衝。
假設類的執行個體被常常讀但非常少被改動,就
能夠考慮使用第二級緩衝。
(7)僅僅有為某個類或集合配置了第二級緩衝,Hibernate在執行時才會把它的執行個體增加到第二級緩衝中。
使用者管理緩衝的方式第一級緩衝的物理介質為記憶體。因為記憶體容量有限。必須通過恰當的檢索策略和檢索方式來限制載入對象的數目。
Session的 evit()方法能夠顯式清空緩衝中特定對象。但這樣的方法不值得推薦。第二級緩衝的物理介質能夠是記憶體和硬碟。因此第二
級緩衝能夠存放大量的資料。資料到期策略的maxElementsInMemory屬性值能夠控制記憶體中的對象數目。
(8)管理第二級緩衝主要包含兩個方面:選擇須要使用第二級緩衝的持久類,設定合適的並發訪問策略:選擇緩衝適配器,設定合適的資料到期策略。
三、 一級緩衝的管理
(1)當應用程式調用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調用查詢介面的 list()、iterate()或
filter()方法時。假設在Session緩衝中還不存在對應的對象。Hibernate就會把該對象增加到第一級緩衝中。當清理緩衝時,
Hibernate會依據緩衝中對象的狀態變化來同步更新資料庫。
Session為應用程式提供了兩個管理緩衝的方法: evict(Object obj)
:從緩衝中清除參數指定的持久化對象。 clear():清空緩衝中全部持久化對象。
(2)save、update、saveOrupdate、load、list、iterate、lock會向一級緩衝存放資料。
save 案例://加入一個學生Student student=new Student();student.setName("小東");s.save(student);//放入一級緩衝//我立即查詢Student stu2=(Student) s.get(Student.class, student.getId()); //selectSystem.out.println("你剛剛加入的學生名字是"+stu2.getName());
(3)什麼操作會從一級緩衝取資料:get、load、list
get / load 會首先從一級緩衝中取,如沒有.再有不同的操作[get 會馬上向資料庫發請求。而load 會返回一個代理對象。直到使用者真的去使用資料。才會向資料庫發請求。
//查詢45號學生Student stu=(Student) s.get(Student.class, 45);System.out.println("|||||||||||||||||||");String hql="from Student where id=45";Student stu2=(Student) s.createQuery(hql).uniqueResult();System.out.println(stu2.getName());
從上面的案例。我們看出 query.list() query.uniueResut() 不會從一級緩取資料! 可是query.list 或者query.uniqueRestu() 會向一級緩衝放資料的.
注意:
① 一級緩衝不須要配置,就能夠使用,它本身沒有保護機制,所以我們程式猿要考慮這個問題,我們能夠同 evict 或者 clear來清除session緩衝中對象. evict 是清除一個對象,clear是清除全部的sesion緩衝對象
② session級緩衝中對象的生命週期, 當session關閉後。就自己主動銷毀.
③ 我們自己用HashMap來類比一個Session緩衝,加深對緩衝的深入.
四、Hibernate二級緩衝的管理
1. Hibernate二級緩衝策略的一般步驟例如以下:
1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇全部欄位)這種SQL語句查詢資料庫,一次獲得全部的資料對象。
2) 把獲得的全部資料對象依據ID放入到第二級緩衝中。
3) 當Hibernate依據ID訪問資料對象的時候,首先從Session一級緩衝中查;查不到,假設配置了二級緩衝,那麼從二級緩衝中查;查不到,再查詢資料庫,把結果依照ID放入到緩衝。
4) 刪除、更新、添加資料的時候,同一時候更新緩衝。
Hibernate二級緩衝策略,是針對於ID查詢的緩衝策略。對於條件查詢則毫無作用。為此。Hibernate提供了針對條件查詢的Query Cache。
5) 二級緩衝的對象可能放在記憶體,也可能放在磁碟.
2. 什麼樣的資料適合存放到第二級緩衝中?
1) 非常少被改動的資料
2) 不是非常重要的資料。同意出現偶爾並發的資料
3) 不會被並發訪問的資料
4) 參考資料,指的是供應用參考的常量資料,它的執行個體數目有限。它的執行個體會被更多類的執行個體引用,執行個體極少或者從來不會被改動。
3. 不適合存放到第二級緩衝的資料?
1) 常常被改動的資料
2) 財務資料,絕對不同意出現並發
3) 與其它應用共用的資料。
4. 經常使用的快取區外掛程式 Hibernater二級緩衝是一個外掛程式,以下是幾種經常使用的快取區外掛程式:
◆EhCache:可作為進程範圍的緩衝,存放資料的物理介質能夠是記憶體或硬碟。對Hibernate的查詢快取提供了支援。
◆OSCache:可作為進程範圍的緩衝。存放資料的物理介質能夠是記憶體或硬碟。提供了豐富的快取資料到期策略。對Hibernate的查詢
緩衝提供了支援。
◆SwarmCache:可作為群集範圍內的緩衝。但不支援Hibernate的查詢快取。
◆JBossCache:可作為群集範圍內的緩衝,支援事務型並發訪問策略,對Hibernate的查詢快取提供了支援。
5. 配置Hibernate二級緩衝的主要步驟:
1) 選擇須要使用二級緩衝的持久化類,設定它的具名快取的並發訪問策略。
這是最值得認真考慮的步驟。
2) 選擇合適的快取區外掛程式,然後編輯該外掛程式的設定檔。
<property name="hbm2ddl.auto">update</property><!-- 啟動二級緩衝 --><property name="cache.use_second_level_cache">true</property><!-- 指定使用哪種二級緩衝 --><property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property><mapping resource="com/hsp/domain/Department.hbm.xml" /><mapping resource="com/hsp/domain/Student.hbm.xml" /><!-- 指定哪個domain啟用二級緩衝 特別說明二級緩衝策略:1. read-only2. read-write3. nonstrict-read-write4. transcational--><class-cache class="com.hsp.domain.Student" usage="read-write"/>
3)能夠把oscache.properties檔案放在 src檔案夾下,這樣你能夠指定放入二級緩衝的對象capacity 大小. 預設1000