hibernate之缓存
1. ? 緩存概念:應(yīng)用數(shù)據(jù)庫訪問數(shù)據(jù)庫的代價(jià)很高,利用持久化的緩存可以減少與數(shù)據(jù)庫之間的交互,可以從緩存中讀取。
? ? 注意:緩存使用不當(dāng),會造成性能的損失。要在正確使用緩存的前提下,適當(dāng)情況使用緩存。
2. ?持久化緩存的級別:
(1)事務(wù)級別:
????緩存對象只能被當(dāng)前事務(wù)使用,每個(gè)事務(wù)都有自己的緩存。事務(wù)結(jié)束,緩存也結(jié)束。
? ? 緩存數(shù)據(jù)以關(guān)聯(lián)對象的形式保存,使用內(nèi)存作為介質(zhì),hibernate的一級緩存即是事務(wù)級別。 ??
(2)應(yīng)用(進(jìn)程)級別:
????可被當(dāng)前應(yīng)用(進(jìn)程)的所有事務(wù)訪問。
????分布式應(yīng)用不能使用該級緩存,使用內(nèi)存或硬盤作為儲存介質(zhì)。hibernate的二級緩存可以是此。
(3)分布式級別:
????若應(yīng)用部署在多臺服務(wù)器的分布式(集群)環(huán)境下,數(shù)據(jù)可被多臺服務(wù)器共享。
? ? 要慎重使用該級別的緩存,多臺服務(wù)器同步緩存可能會消耗大量的帶寬。hibernate的二級緩存也可以是此?。
3. ?hibernate的一級緩存?
?(1)概念:是內(nèi)置緩存,不能人為地取消,也稱session緩存。事務(wù)級別的緩存,若一次事務(wù)多次修改對象,提交時(shí)只會執(zhí)行一條語句,更新所有的修改。
(2)實(shí)現(xiàn)原理:可以把一級緩存想象為session對象維護(hù)的一個(gè)map對象,保存session使用過的對象,session讀取數(shù)據(jù)時(shí)先依據(jù)對象的類型和標(biāo)識符屬性查找,沒有在讀數(shù)據(jù)庫,同時(shí)保存在map中。
(3)管理一級緩存:
? ? ?使用session.evict() 方法移除緩存對象,使之變?yōu)橥泄軤顟B(tài)。
? ? ?使用session.clear()方法清除緩存中的所有對象。
? ? ?使用session的contains()判斷是否在一級緩存中, flush()同步數(shù)據(jù)與數(shù)據(jù)庫一致,setReadOnly()設(shè)置為只讀對象(不執(zhí)行臟數(shù)據(jù)檢查)
4. ?hibernate的二級緩存?
?(1)概念:由SessionFactory對象管理,應(yīng)用級別緩存,又稱為SessionFactory緩存。會被整個(gè)應(yīng)用的session共享。先一級,在二級。
?(2)二級緩存組件:hibernate沒有自己的二級緩存組件
組件 | Provider類 | 類型 | 集群 | 查詢緩存 |
Hashtable | org.hibernate.cache.HashtableCacheProvider | 內(nèi)存 | 不支持 | 支持 |
EHCache | org.hibernate.cache.EhCacheProvider | 內(nèi)存,硬盤 | 不支持 | 支持 |
OSCache | org.hibernate.cache.OSCacheProvider | 內(nèi)存,硬盤 | 不支持 | 支持 |
SwarmCache | org.hibernate.cache.SwarmCacheProvider | 集群 | 支持 | 不支持 |
JBoss Cache | org.hibernate.cache.TreeCacheProvider | 集群 | 支持 | 支持 |
?(3)二級緩存策略:
●?? 只讀緩存(read-only)
?????? 如果應(yīng)用程序需要讀取一個(gè)持久化類的實(shí)例,但并不打算修改它們,可以使用read-only緩存。
????????對于從來不會修改的數(shù)據(jù),如參考數(shù)據(jù),可以使用這種并發(fā)訪問策略。
●?? 讀/寫緩存(read-write)
?????? 如果應(yīng)用程序需要更新數(shù)據(jù),該緩存比較合適。如果需要序列化事務(wù)隔離級別,那么就不能使用這種緩存策略。
????????若在分布式應(yīng)用中使用該策略,需要底層的緩存組件支持鎖定機(jī)制。
●?? 不嚴(yán)格的讀/寫緩存(nonstrict-read-write)
?????? 如果程序讀取頻繁且極少更新數(shù)據(jù)(也就是說,出現(xiàn)兩個(gè)事務(wù)同時(shí)更新同一個(gè)條目的現(xiàn)象很不常見),也不需要十分嚴(yán)格的事務(wù)隔離,適用該緩存。
????????對于極少被修改,并且允許偶爾臟讀的數(shù)據(jù),可以采用這種并發(fā)訪問策略。
●?? 事務(wù)緩存(transactional)
?????? transactional緩存策略提供了對全事務(wù)的緩存,僅僅用于JTA環(huán)境中。它提供了Repeatable Read事務(wù)隔離級別。
(4)管理二級緩存:
? ? ? ? SessionFactory對象的evict(Class arg0)方法:
? ? ? ? ? ? ? ? 可以從二級緩存中清除指定的持久化類的所有緩存對象,并釋放其占用的資源。
? ? ? ? ? ? ? ? 如:sessionFactory.evict(Category.class);
? ? ? ? SessionFactory對象的evict(Class arg0,Serializable arg1)方法:
? ? ? ? ? ? ? ? 可以從二級緩存中清除某個(gè)持久化類的指定緩存對象。
? ? ? ? ? ? ? ? 如:sessionFactory.evict(Category.class,new Integer(1));
? ? ? ? SessionFactory對象的evictCollection(String arg0)方法:
? ? ? ? ? ? ? ? 可以從二級緩存中清除指定的集合對象的緩存。
? ? ? ? ? ? ? ? 如:sessionFactory.evictCollection("com.hibernate.beans.products");
? ? ? ? ?SessionFactory對象的evictCollection(String arg0,Serializable arg1)方法:
? ? ? ? ? ? ? ? 可以從二級緩存中清除集合對象中的指定對象。
? ? ? ? ? ? ? ? 如:sessionFactory.evictCollection("com.hibernate.beans.products",new Integer(1));
? ? ? ? SessionFactory對象的evictEntity(String arg0)方法:
? ? ? ? ? ? ? ? 可以從二級緩存中清除指定的持久化類的所有緩存對象。
? ? ? ? ? ? ? ? 如:sessionFacotry.evictEntity("com.hibernate.beans.Category");
? ? ? ???SessionFactory對象的evictEntity(String arg0,Serializable arg1)方法:
? ? ? ? ? ? ? ?可以從二級緩存中清除某個(gè)持久化類的指定對象。
? ? ? ? ? ? ? ?如:sessionFacotry.evictEntity("com.hibernate.beans.Category",new Integer(1));
5. ?查詢緩存
? ? ? ? 查詢緩存使用map對象保存被緩存對象,(key值根據(jù)sql、查詢參數(shù)、分頁參數(shù)等構(gòu)造)保證同樣查詢有同樣key值;
? ? ? ? hibernate會記錄每個(gè)表的最后更新時(shí)間,并且查詢緩存也有時(shí)間,hibernate會比較這兩個(gè)時(shí)間判斷緩存有效性。
6. 緩存對get(), load(), list(), iterator() 方法的影響
(1)get():先從一級緩存,后直接從數(shù)據(jù)庫。緩存到一級緩存。
(2)load():先從一級緩存,再從二級緩存,最后從數(shù)據(jù)庫。緩存到一二級緩存。
(3)Query的list():先檢查是否配置查詢緩存,在直接從數(shù)據(jù)庫中;緩存到一二級,查詢緩存中。
(4) Query的iterator():先從數(shù)據(jù)庫查詢所有符合條件的標(biāo)識符屬性值(id),再通過load()方法查詢對應(yīng)數(shù)據(jù)。
注:本文參考《Hibernate開發(fā)與實(shí)戰(zhàn)》 劉偉 張利國 電子工業(yè)出版社 一書
轉(zhuǎn)載于:https://blog.51cto.com/lindianli/1433809
總結(jié)
以上是生活随笔為你收集整理的hibernate之缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米wifiapp怎么测网速(Xiaom
- 下一篇: 得物app怎么删除与客服的聊天记录