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

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

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

    Hibernate獲取數(shù)據(jù)方式與緩存使用

    Hibernate獲取數(shù)據(jù)的方式有不同的幾種,其與緩存結(jié)合使用的效果也不盡相同,而Hibernate中具體怎么使用緩存其實(shí)是我們很關(guān)心的一個(gè)問(wèn)題,直接涉及到性能方面。
    緩存在Hibernate中主要有三個(gè)方面:一級(jí)緩存、二級(jí)緩存和查詢(xún)緩存;一級(jí)緩存在Hibernate中對(duì)應(yīng)的即為session范圍的緩存,也就是當(dāng)session關(guān)閉時(shí)緩存即被清除,一級(jí)緩存在Hibernate中是不可配置的部分;二級(jí)緩存在Hibernate中對(duì)應(yīng)的即為SessionFactory范圍的緩存,通常來(lái)講SessionFactory的生命周期和應(yīng)用的生命周期相同,所以可以看成是進(jìn)程緩存或集群緩存,二級(jí)緩存在Hibernate中是可以配置的,可以通過(guò)class-cache配置類(lèi)粒度級(jí)別的緩存(class-cache在class中數(shù)據(jù)發(fā)生任何變化的情況下自動(dòng)更新),同時(shí)也可通過(guò)collection-cache配置集合粒度級(jí)別的緩存(collection-cache僅在collection中增加了元素或者刪除了元素的情況下才自動(dòng)更新,也就是當(dāng)collection中元素發(fā)生值的變化的情況下它是不會(huì)自動(dòng)更新的),緩存自然會(huì)帶來(lái)并發(fā)的訪(fǎng)問(wèn)問(wèn)題,這個(gè)時(shí)候相應(yīng)的就要根據(jù)應(yīng)用來(lái)設(shè)置緩存所采用的事務(wù)隔離級(jí)別,和數(shù)據(jù)庫(kù)的事務(wù)隔離級(jí)別概念基本一樣,沒(méi)什么多介紹的,^_^;查詢(xún)緩存在Hibernate同樣是可配置的,默認(rèn)是關(guān)閉的,可以通過(guò)設(shè)置cache.use_?query_cache為true來(lái)打開(kāi)查詢(xún)緩存。根據(jù)緩存的通常實(shí)現(xiàn)策略,我們可以來(lái)理解Hibernate的這三種緩存,緩存的實(shí)現(xiàn)通過(guò)是通過(guò)key/value的Map方式來(lái)實(shí)現(xiàn),在Hibernate的一級(jí)、二級(jí)和查詢(xún)緩存也同樣如此,一級(jí)、二級(jí)緩存使用的key均為po的主鍵ID,value即為po實(shí)例對(duì)象,查詢(xún)緩存使用的則為查詢(xún)的條件、查詢(xún)的參數(shù)、查詢(xún)的頁(yè)數(shù),value有兩種情況,如果采用的是select po.property這樣的方式那么value為整個(gè)結(jié)果集,如采用的是from這樣的方式那么value為獲取的結(jié)果集中各po對(duì)象的主鍵ID,這樣的作用很明顯,節(jié)省內(nèi)存,^_^
    簡(jiǎn)單介紹完Hibernate的緩存后,再結(jié)合Hibernate的獲取數(shù)據(jù)方式來(lái)說(shuō)明緩存的具體使用方式,在Hibernate中獲取數(shù)據(jù)常用的方式主要有四種:Session.load、Session.get、Query.list、Query.iterator。
    1、Session.load
    ????? 在執(zhí)行session.load時(shí),Hibernate首先從當(dāng)前session的一級(jí)緩存中獲取id對(duì)應(yīng)的值,在獲取不到的情況下,將根據(jù)該對(duì)象是否配置了二級(jí)緩存來(lái)做相應(yīng)的處理,如配置了二級(jí)緩存,則從二級(jí)緩存中獲取id對(duì)應(yīng)的值,如仍然獲取不到則還需要根據(jù)是否配置了延遲加載來(lái)決定如何執(zhí)行,如未配置延遲加載則從數(shù)據(jù)庫(kù)中直接獲取,在從數(shù)據(jù)庫(kù)獲取到數(shù)據(jù)的情況下,Hibernate會(huì)相應(yīng)的填充一級(jí)緩存和二級(jí)緩存,如配置了延遲加載則直接返回一個(gè)代理類(lèi),只有在觸發(fā)代理類(lèi)的調(diào)用時(shí)才進(jìn)行數(shù)據(jù)庫(kù)查詢(xún)的操作。
    ????? 在這樣的情況下我們就可以看到,在session一直打開(kāi)的情況下,要注意在適當(dāng)?shù)臅r(shí)候?qū)σ患?jí)緩存進(jìn)行刷新操作,通常是在該對(duì)象具有單向關(guān)聯(lián)維護(hù)的時(shí)候,在Hibernate中可以使用象session.clear、session.evict的方式來(lái)強(qiáng)制刷新一級(jí)緩存。
    ????? 二級(jí)緩存則在數(shù)據(jù)發(fā)生任何變化(新增、更新、刪除)的情況下都會(huì)自動(dòng)的被更新。
    2、Session.get
    ????? 在執(zhí)行Session.get時(shí),和Session.load不同的就是在當(dāng)從緩存中獲取不到時(shí),直接從數(shù)據(jù)庫(kù)中獲取id對(duì)應(yīng)的值。
    3、Query.list
    ????? 在執(zhí)行Query.list時(shí),Hibernate的做法是首先檢查是否配置了查詢(xún)緩存,如配置了則從查詢(xún)緩存中查找key為查詢(xún)語(yǔ)句+查詢(xún)參數(shù)+分頁(yè)條件的值,如獲取不到則從數(shù)據(jù)庫(kù)中進(jìn)行獲取,從數(shù)據(jù)庫(kù)獲取到后Hibernate將會(huì)相應(yīng)的填充一級(jí)、二級(jí)和查詢(xún)緩存,如獲取到的為直接的結(jié)果集,則直接返回,如獲取到的為一堆id的值,則再根據(jù)id獲取相應(yīng)的值(Session.load),最后形成結(jié)果集返回,可以看到,在這樣的情況下,list也是有可能造成N次的查詢(xún)的。
    ????? 查詢(xún)緩存在數(shù)據(jù)發(fā)生任何變化的情況下都會(huì)被自動(dòng)的清空。
    4、Query.iterator
    ????? 在執(zhí)行Query.iterator時(shí),和Query.list的不同的在于從數(shù)據(jù)庫(kù)獲取的處理上,Query.iterator向數(shù)據(jù)庫(kù)發(fā)起的是select id from這樣的語(yǔ)句,也就是它是先獲取符合查詢(xún)條件的id,之后在進(jìn)行iterator.next調(diào)用時(shí)才再次發(fā)起session.load的調(diào)用獲取實(shí)際的數(shù)據(jù)。
    ????? 可見(jiàn),在擁有二級(jí)緩存并且查詢(xún)參數(shù)多變的情況下,Query.iterator會(huì)比Query.list更為高效。

    這四種獲取數(shù)據(jù)的方式都各有適用的場(chǎng)合,要根據(jù)實(shí)際情況做相應(yīng)的決定,^_^,最好的方式無(wú)疑就是打開(kāi)show_sql選項(xiàng)看看執(zhí)行的情況來(lái)做分析,系統(tǒng)結(jié)構(gòu)上只用保證這種調(diào)整是容易實(shí)現(xiàn)的就好了,在cache這個(gè)方面的調(diào)整自然是非常的容易,只需要調(diào)整配置文件里的設(shè)置,而查詢(xún)的方式則可對(duì)外部進(jìn)行屏蔽,這樣要根據(jù)實(shí)際情況調(diào)整也非常容易。

    推薦三篇關(guān)于Hibernate緩存機(jī)制介紹的文章:
    http://gocom.primeton.com/blog/index.php?op=ViewArticle&articleId=467&blogId=37&src=jdon&srcforum=62
    http://club.gamvan.com/club/clubPage.jsp?ccStyle=0&tID=10456&ccID=37
    http://www.devx.com/dbzone/Article/29685/1954?pf=true

    posted on 2006-04-06 10:49 BlueDavy 閱讀(3462) 評(píng)論(3)  編輯  收藏 所屬分類(lèi): Java

    評(píng)論

    # re: Hibernate獲取數(shù)據(jù)方式與緩存使用 2006-04-06 19:04 Jkallen

    值得收藏!!!!  回復(fù)  更多評(píng)論   

    # 我認(rèn)為樓主的理解有誤 2006-04-15 11:32 老田

    樓主的理解有誤,首先一級(jí)緩沖也就是說(shuō)內(nèi)部緩存 并不是相對(duì)于Session的,而是對(duì)于SessionFactory的,SessionFactory使用該緩沖來(lái)存放預(yù)定的SQL和映射元數(shù)據(jù),另外,二極緩存也是針對(duì)于SessionFactory的,用來(lái)保存讀取過(guò)的數(shù)據(jù),比如那些游離狀態(tài)的數(shù)據(jù)等。

      回復(fù)  更多評(píng)論   

    # re: Hibernate獲取數(shù)據(jù)方式與緩存使用 2006-04-15 20:21 BlueDavy

    一級(jí)緩存的數(shù)據(jù)是指緩存在session中的數(shù)據(jù),而不是SessionFactory,預(yù)定的SQL和映射元數(shù)據(jù)確實(shí)是SessionFactory級(jí)別的,但這不屬于數(shù)據(jù)緩存類(lèi)別..  回復(fù)  更多評(píng)論   

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導(dǎo)航

    <2006年4月>
    2627282930311
    2345678
    9101112131415
    16171819202122
    23242526272829
    30123456

    統(tǒng)計(jì)

    隨筆分類(lèi)

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 久久亚洲国产最新网站| 一级女性全黄生活片免费看| 久久久久亚洲AV无码专区桃色| 国产成人精品免费午夜app| 一级毛片无遮挡免费全部| 亚洲人成自拍网站在线观看| 亚洲一二成人精品区| 不卡一卡二卡三亚洲| 免费a级毛片在线观看| 成人A级毛片免费观看AV网站| 1a级毛片免费观看| 中文字幕无码毛片免费看 | 久久国产色AV免费观看| 日韩亚洲国产二区| 久久久久女教师免费一区| 男男gay做爽爽的视频免费| 亚洲日产乱码一二三区别 | 亚洲精品视频在线免费| 青青操免费在线观看| 一级毛片免费观看不收费| 黄色免费网站在线看| 亚洲av日韩综合一区久热| 亚洲性色AV日韩在线观看| 亚洲精品免费网站| 亚洲自国产拍揄拍| 亚洲制服丝袜中文字幕| 亚洲综合无码一区二区痴汉| 亚洲a∨无码男人的天堂| 精品久久亚洲中文无码| 亚洲AV综合色区无码二区偷拍| 亚洲性无码av在线| 亚洲激情黄色小说| 亚洲一区中文字幕在线观看| 亚洲人色大成年网站在线观看| 亚洲欧洲国产综合| 亚洲AV无码一区二区三区人| 亚洲一区二区三区无码国产| 最新国产成人亚洲精品影院| 亚洲精品精华液一区二区| 亚洲av成人一区二区三区在线播放| 国产精品久久久久久亚洲小说|