<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-86  評論-33  文章-0  trackbacks-0
    轉(zhuǎn)載--
    Hibernate獲取數(shù)據(jù)的方式有不同的幾種,其與緩存結(jié)合使用的效果也不盡相同,而Hibernate中具體怎么使用緩存其實(shí)是我們很關(guān)心的一個(gè)問題,直接涉及到性能方面。

    緩存在Hibernate中主要有三個(gè)方面:一級緩存、二級緩存和查詢緩存;一級緩存在Hibernate中對應(yīng)的即為session范圍的緩存,也就是當(dāng)session關(guān)閉時(shí)緩存即被清除,一級緩存在Hibernate中是不可配置的部分;二級緩存在Hibernate中對應(yīng)的即為SessionFactory范圍的緩存,通常來講SessionFactory的生命周期和應(yīng)用的生命周期相同,所以可以看成是進(jìn)程緩存或集群緩存,二級緩存在Hibernate中是可以配置的,可以通過class-cache配置類粒度級別的緩存(class-cache在class中數(shù)據(jù)發(fā)生任何變化的情況下自動(dòng)更新),同時(shí)也可通過collection-cache配置集合粒度級別的緩存(collection-cache僅在collection中增加了元素或者刪除了元素的情況下才自動(dòng)更新,也就是當(dāng)collection中元素發(fā)生值的變化的情況下它是不會自動(dòng)更新的),緩存自然會帶來并發(fā)的訪問問題,這個(gè)時(shí)候相應(yīng)的就要根據(jù)應(yīng)用來設(shè)置緩存所采用的事務(wù)隔離級別,和數(shù)據(jù)庫的事務(wù)隔離級別概念基本一樣,沒什么多介紹的,^_^;查詢緩存在Hibernate同樣是可配置的,默認(rèn)是關(guān)閉的,可以通過設(shè)置cache.use_  query_cache為true來打開查詢緩存。根據(jù)緩存的通常實(shí)現(xiàn)策略,我們可以來理解Hibernate的這三種緩存,緩存的實(shí)現(xiàn)通過是通過key/value的Map方式來實(shí)現(xiàn),在Hibernate的一級、二級和查詢緩存也同樣如此,一級、二級緩存使用的key均為po的主鍵ID,value即為po實(shí)例對象,查詢緩存使用的則為查詢的條件、查詢的參數(shù)、查詢的頁數(shù),value有兩種情況,如果采用的是select  po.property這樣的方式那么value為整個(gè)結(jié)果集,如采用的是from這樣的方式那么value為獲取的結(jié)果集中各po對象的主鍵ID,這樣的作用很明顯,節(jié)省內(nèi)存,^_^

    簡單介紹完Hibernate的緩存后,再結(jié)合Hibernate的獲取數(shù)據(jù)方式來說明緩存的具體使用方式,在Hibernate中獲取數(shù)據(jù)常用的方式主要有四種:Session.load、Session.get、Query.list、Query.iterator。

    1、Session.load
               在執(zhí)行session.load時(shí),Hibernate首先從當(dāng)前session的一級緩存中獲取id對應(yīng)的值,在獲取不到的情況下,將根據(jù)該對象是否配置了二級緩存來做相應(yīng)的處理,如配置了二級緩存,則從二級緩存中獲取id對應(yīng)的值,如仍然獲取不到則還需要根據(jù)是否配置了延遲加載來決定如何執(zhí)行,如未配置延遲加載則從數(shù)據(jù)庫中直接獲取,在從數(shù)據(jù)庫獲取到數(shù)據(jù)的情況下,Hibernate會相應(yīng)的填充一級緩存和二級緩存,如配置了延遲加載則直接返回一個(gè)代理類,只有在觸發(fā)代理類的調(diào)用時(shí)才進(jìn)行數(shù)據(jù)庫查詢的操作。
               在這樣的情況下我們就可以看到,在session一直打開的情況下,要注意在適當(dāng)?shù)臅r(shí)候?qū)σ患壘彺孢M(jìn)行刷新操作,通常是在該對象具有單向關(guān)聯(lián)維護(hù)的時(shí)候,在Hibernate中可以使用象session.clear、session.evict的方式來強(qiáng)制刷新一級緩存。
               二級緩存則在數(shù)據(jù)發(fā)生任何變化(新增、更新、刪除)的情況下都會自動(dòng)的被更新。

    2、Session.get
               在執(zhí)行Session.get時(shí),和Session.load不同的就是在當(dāng)從緩存中獲取不到時(shí),直接從數(shù)據(jù)庫中獲取id對應(yīng)的值。

    3、Query.list
               在執(zhí)行Query.list時(shí),Hibernate的做法是首先檢查是否配置了查詢緩存,如配置了則從查詢緩存中查找key為查詢語句+查詢參數(shù)+分頁條件的值,如獲取不到則從數(shù)據(jù)庫中進(jìn)行獲取,從數(shù)據(jù)庫獲取到后Hibernate將會相應(yīng)的填充一級、二級和查詢緩存,如獲取到的為直接的結(jié)果集,則直接返回,如獲取到的為一堆id的值,則再根據(jù)id獲取相應(yīng)的值(Session.load),最后形成結(jié)果集返回,可以看到,在這樣的情況下,list也是有可能造成N次的查詢的。
               查詢緩存在數(shù)據(jù)發(fā)生任何變化的情況下都會被自動(dòng)的清空。

    4、Query.iterator
               在執(zhí)行Query.iterator時(shí),和Query.list的不同的在于從數(shù)據(jù)庫獲取的處理上,Query.iterator向數(shù)據(jù)庫發(fā)起的是select  id  from這樣的語句,也就是它是先獲取符合查詢條件的id,之后在進(jìn)行iterator.next調(diào)用時(shí)才再次發(fā)起session.load的調(diào)用獲取實(shí)際的數(shù)據(jù)。
               可見,在擁有二級緩存并且查詢參數(shù)多變的情況下,Query.iterator會比Query.list更為高效
    posted on 2006-08-16 16:22 Derek.Guo 閱讀(634) 評論(0)  編輯  收藏 所屬分類: Java
    MSN:envoydada@hotmail.com QQ:34935442
    主站蜘蛛池模板: 在线免费观看毛片网站| 99久久综合国产精品免费| 亚洲欧洲国产成人综合在线观看 | 女人被男人躁的女爽免费视频| 图图资源网亚洲综合网站| 免费黄网站在线看| 久久亚洲精品成人AV| 2021久久精品免费观看| 天堂亚洲国产中文在线| 日韩一区二区在线免费观看| 亚洲国产区男人本色| 亚洲日韩国产一区二区三区| 最近2019中文免费字幕在线观看| 丁香五月亚洲综合深深爱| 久久久久久AV无码免费网站下载 | 日本高清免费不卡视频| 国产AV日韩A∨亚洲AV电影 | 久久久久亚洲AV无码专区首| 久久99精品免费视频| 亚洲三级中文字幕| 国产高清在线免费视频| aa毛片免费全部播放完整| 91亚洲国产成人久久精品网站| 亚洲高清中文字幕免费| 日韩国产欧美亚洲v片| 亚洲精品无码mv在线观看网站 | 日韩激情无码免费毛片| 国产福利电影一区二区三区,免费久久久久久久精 | 国产男女爽爽爽爽爽免费视频| 亚洲熟女综合色一区二区三区| 又粗又大又长又爽免费视频| a级在线免费观看| 亚洲av永久无码精品三区在线4| 国产婷婷高清在线观看免费| 国产精品成人啪精品视频免费| 337p日本欧洲亚洲大胆色噜噜| 免费看片免费播放| 午夜精品射精入后重之免费观看| 久久夜色精品国产噜噜亚洲a| 国产成人亚洲影院在线观看| 精品国产sm捆绑最大网免费站|