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

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

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

    Hibernate獲取數據方式與緩存使用

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

    這四種獲取數據的方式都各有適用的場合,要根據實際情況做相應的決定,^_^,最好的方式無疑就是打開show_sql選項看看執行的情況來做分析,系統結構上只用保證這種調整是容易實現的就好了,在cache這個方面的調整自然是非常的容易,只需要調整配置文件里的設置,而查詢的方式則可對外部進行屏蔽,這樣要根據實際情況調整也非常容易。

    推薦三篇關于Hibernate緩存機制介紹的文章:
    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) 評論(3)  編輯  收藏 所屬分類: Java

    評論

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

    值得收藏!!!!  回復  更多評論   

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

    樓主的理解有誤,首先一級緩沖也就是說內部緩存 并不是相對于Session的,而是對于SessionFactory的,SessionFactory使用該緩沖來存放預定的SQL和映射元數據,另外,二極緩存也是針對于SessionFactory的,用來保存讀取過的數據,比如那些游離狀態的數據等。

      回復  更多評論   

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

    一級緩存的數據是指緩存在session中的數據,而不是SessionFactory,預定的SQL和映射元數據確實是SessionFactory級別的,但這不屬于數據緩存類別..  回復  更多評論   

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導航

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

    統計

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲美国产亚洲AV| 中文字幕在线日亚洲9| 无遮挡a级毛片免费看| 在线A级毛片无码免费真人| 亚洲国产中文在线二区三区免| 日韩精品无码专区免费播放| 亚洲嫩草影院久久精品| 麻豆精品不卡国产免费看| 亚洲av无码专区在线播放| 国产精品免费高清在线观看| 911精品国产亚洲日本美国韩国| 久久青草国产免费观看| 亚洲精品国产福利在线观看| 91嫩草免费国产永久入口| 亚洲91精品麻豆国产系列在线| 动漫黄网站免费永久在线观看 | 亚洲中文字幕无码一区二区三区 | 亚洲AV无码乱码国产麻豆 | 全免费a级毛片免费**视频 | 一日本道a高清免费播放| 亚洲愉拍99热成人精品热久久| 久久久精品视频免费观看| 亚洲成色在线影院| 午夜宅男在线永久免费观看网| 亚洲av永久无码精品网址| 又黄又爽无遮挡免费视频| 美女被免费网站91色| 亚洲国产高清在线| 成人毛片免费网站| 又硬又粗又长又爽免费看| 亚洲日韩欧洲无码av夜夜摸 | 成年女人看片免费视频播放器| 久久精品熟女亚洲av麻豆| 亚洲欧洲美洲无码精品VA| 日本视频一区在线观看免费| 亚洲精品国产av成拍色拍| 久久久久噜噜噜亚洲熟女综合| 在线a免费观看最新网站| 精品韩国亚洲av无码不卡区| 精品国产_亚洲人成在线高清| 在线观看H网址免费入口|