Hibernate 笔记 缓存
1 Hibernate 緩存
緩存是數(shù)據(jù)庫數(shù)據(jù)在內(nèi)存中的臨時容器,它包含了庫表數(shù)據(jù)在內(nèi)存中的臨時拷貝,位于數(shù)據(jù)庫和訪問層之間。ORM在進(jìn)行數(shù)據(jù)讀取時,會根據(jù)緩存管理策略,首先在緩沖中查詢,如果發(fā)現(xiàn),則直接使用,避免數(shù)據(jù)庫調(diào)用的開銷。
? 數(shù)據(jù)緩存的策略: ?事務(wù)級緩存:當(dāng)前事務(wù)范圍內(nèi)的數(shù)據(jù)緩存 ?應(yīng)用級緩存:某個應(yīng)用中的數(shù)據(jù)緩存 ?分布式緩存:多個應(yīng)用,多個JVM之間共享緩存。分布式緩存由多個應(yīng)用級緩存實(shí)例組成集群,通過某種遠(yuǎn)程機(jī)制實(shí)現(xiàn)各個緩存實(shí)例之間的數(shù)據(jù)同步,任何一個實(shí)例的 ? ????????? ?? 數(shù)據(jù)修改后,將導(dǎo)致整個集群間的數(shù)據(jù)狀態(tài)同步。 2 一級緩存- 一級緩存的數(shù)據(jù)結(jié)構(gòu)是Map,用于存儲查詢實(shí)體。Map的key存放實(shí)體的Id,Map的value存放實(shí)體本身。所以一級緩存無法存儲查詢的屬性。
- 一級緩存的生命周期與Session有關(guān),Session產(chǎn)生一級緩存創(chuàng)建,Session關(guān)閉一級緩存銷毀
- Get,Load,Iterator方法讀寫一級緩存,List方法只寫不讀一級緩存
???????????????? ?load(get)查詢數(shù)據(jù)步驟:
??????????????????????????????????????????????????????? 1查詢一級緩存
?
?????????????????????? ?? ?????? 2 一級緩存沒有數(shù)據(jù),發(fā)送SQL,有數(shù)據(jù)返回?cái)?shù)據(jù)
?
??????????????????????? ?? ????? 3 寫入一級緩存
?
??????????????????? ????????????
?
?
?????????? ????? Iterator查詢數(shù)據(jù)步驟:
?????????????????????????? ? 1? 發(fā)送查詢id的sql
?????????????????????????????2??根據(jù)id查詢緩存
???????????????????????????? 3? 如果緩存中有數(shù)據(jù),直接取出,如果沒有去數(shù)據(jù)庫中查詢,并寫入一級緩存
- 一級緩存不能禁用,但可以通過Session的clear方法和evict方法清理一級緩存,從而達(dá)到禁止寫緩存的效果
- Session的save方法會寫緩存,在批量插入數(shù)據(jù)時要注意對一級緩存做定時清理。Hibernate的批量處理效率不高,建議使用Session.connection()或得Jdbc連接后使用Jdbc的相關(guān)API做批處理操作
1、打開緩存,在hibernate.cfg.xm中加入:?
<property name="hibernate.cache.use_second_level_cache">true</property>?
2、指定緩存策略提供商,在hibernate.cfg.xm中加入:?
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>?
3、拷貝echcahe.xml到src下,可以針對不同的策略配置緩存?
4、指定那些類使用緩存(兩種方式)? ???<class-cache class="com.gzl.po.Dept usage="read-only"/>? ? * 在hibernate.cfg.xml???
? * 在映射文件中?
- 二級緩存也稱進(jìn)程級的緩存或SessionFactory級的緩存,二級緩存可以被所有的session共享。
- 二級緩存的生命周期和SessionFactory的生命周期一致,SessionFactory可以管理二級緩存。
- Hibernate 默認(rèn)情況下是打開的,提供一個Hashtable存儲二級緩存,但只適用于研發(fā),開發(fā)中為第三方緩存組件提供了接入接口,我們可以根據(jù)不同情況選擇不同的實(shí)現(xiàn)。
- 二級緩存也只能緩存實(shí)體對象,不緩存屬性。
- Get,Load,Iterator方法讀寫二級緩存,List方法只寫不讀二級緩存
???????????????? ?load(get)查詢數(shù)據(jù)步驟:
??????????????????????????????????????????????????????? 1查詢一級緩存 如果沒有數(shù)據(jù),查詢二級緩存
?????????????????????? ?? ?????? 2 二級緩存也沒有數(shù)據(jù) 去數(shù)據(jù)庫查找,如果有會拷貝到一級緩存
??????????????????????? ?? ????? 3 寫入一級緩存
??????????????????? ?? ??????????4 拷貝到二級緩存
- 設(shè)置<property name=“hibernate.cache.use_second_level_cache”>fasle</property>可以禁用二級緩存。
- 在一次Session交互中,可以設(shè)置Session的CacheMode為Put來禁用讀操作,設(shè)置CacheMode為Get來禁用寫操作
- 也可以通過SessionFacotry的evict方法清理二級緩存來達(dá)到禁止寫二級緩存的效果
- 查詢緩存是針對普通屬性結(jié)果集的緩存,對實(shí)體對象的結(jié)果集只緩存id
- 查詢緩存的生命周期為當(dāng)前關(guān)聯(lián)的表發(fā)生修改,那么查詢緩存生命周期結(jié)束
- 查詢緩存的配置和使用:
* 在hibernate.cfg.xml文件中啟用查詢緩存,如:
<property name="hibernate.cache.use_query_cache">true</property>
??? * 在程序中必須手動啟用查詢緩存,如:
query.setCacheable(true);
- List方法讀寫查詢緩存,Iterator不讀查詢緩存
- 二級緩存和查詢緩存搭配使用效果最佳
轉(zhuǎn)載于:https://www.cnblogs.com/zilong882008/archive/2011/11/07/2239397.html
總結(jié)
以上是生活随笔為你收集整理的Hibernate 笔记 缓存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 函数指针声明时的形参列表可以没有
- 下一篇: 无法显示 xml 页 解决方案