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

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

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

    lqxue

    常用鏈接

    統(tǒng)計

    book

    tools

    最新評論

    Hibernate二級緩存全攻略

    【IT168 技術(shù)文檔】很多人對二級緩存都不太了解,或者是有錯誤的認識,我一直想寫一篇文章介紹一下hibernate的二級緩存的,今天終于忍不住了。
    我的經(jīng)驗主要來自hibernate2.1版本,基本原理和3.0、3.1是一樣的,請原諒我的頑固不化。

        hibernate的session提供了一級緩存,每個session,對同一個id進行兩次load,不會發(fā)送兩條sql給數(shù)據(jù)庫,但是session關(guān)閉的時候,一級緩存就失效了。

        二級緩存是SessionFactory級別的全局緩存,它底下可以使用不同的緩存類庫,比如ehcache、oscache等,需要設(shè)置hibernate.cache.provider_class,我們這里用ehcache,在2.1中就是
    hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
    如果使用查詢緩存,加上
    hibernate.cache.use_query_cache=true

    緩存可以簡單的看成一個Map,通過key在緩存里面找value。

    Class的緩存
        對于一條記錄,也就是一個PO來說,是根據(jù)ID來找的,緩存的key就是ID,value是POJO。無論list,load還是 iterate,只要讀出一個對象,都會填充緩存。但是list不會使用緩存,而iterate會先取數(shù)據(jù)庫select id出來,然后一個id一個id的load,如果在緩存里面有,就從緩存取,沒有的話就去數(shù)據(jù)庫load。假設(shè)是讀寫緩存,需要設(shè)置:

    <cache usage="read-write"/>

        如果你使用的二級緩存實現(xiàn)是ehcache的話,需要配置ehcache.xml
    <cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" />

        其中eternal表示緩存是不是永遠不超時,timeToLiveSeconds是緩存中每個元素(這里也就是一個POJO)的超時時間,如果 eternal="false",超過指定的時間,這個元素就被移走了。timeToIdleSeconds是發(fā)呆時間,是可選的。當(dāng)往緩存里面put 的元素超過500個時,如果overflowToDisk="true",就會把緩存中的部分數(shù)據(jù)保存在硬盤上的臨時文件里面。

        每個需要緩存的class都要這樣配置。如果你沒有配置,hibernate會在啟動的時候警告你,然后使用defaultCache的配置,這樣多個class會共享一個配置。
    當(dāng)某個ID通過hibernate修改時,hibernate會知道,于是移除緩存。

        這樣大家可能會想,同樣的查詢條件,第一次先list,第二次再iterate,就可以使用到緩存了。實際上這是很難的,因為你無法判斷什么時候是第一 次,而且每次查詢的條件通常是不一樣的,假如數(shù)據(jù)庫里面有100條記錄,id從1到100,第一次list的時候出了前50個id,第二次 iterate的時候卻查詢到30至70號id,那么30-50是從緩存里面取的,51到70是從數(shù)據(jù)庫取的,共發(fā)送1+20條sql。所以我一直認為 iterate沒有什么用,總是會有1+N的問題。

        (題外話:有說法說大型查詢用list會把整個結(jié)果集裝入內(nèi)存,很慢,而iterate只select id比較好,但是大型查詢總是要分頁查的,誰也不會真的把整個結(jié)果集裝進來,假如一頁20條的話,iterate共需要執(zhí)行21條語句,list雖然選擇 若干字段,比iterate第一條select id語句慢一些,但只有一條語句,不裝入整個結(jié)果集hibernate還會根據(jù)數(shù)據(jù)庫方言做優(yōu)化,比如使用mysql的limit,整體看來應(yīng)該還是 list快。)

        如果想要對list或者iterate查詢的結(jié)果緩存,就要用到查詢緩存了


    posted on 2008-07-03 13:29 lqx 閱讀(157) 評論(0)  編輯  收藏 所屬分類: database

    主站蜘蛛池模板: 欧洲精品码一区二区三区免费看| 亚洲av无码一区二区三区天堂古代| 久久久久亚洲国产AV麻豆| 男人的好看免费观看在线视频 | 日本免费人成网ww555在线| 国产AⅤ无码专区亚洲AV| 永久黄网站色视频免费| 亚洲色偷偷综合亚洲AV伊人蜜桃 | 久久久久亚洲精品影视 | 黄页网站免费在线观看| 亚洲成av人片在线看片| 国产精品视频永久免费播放| 国产成人精品日本亚洲专一区 | 在线免费观看你懂的| 亚洲成av人片不卡无码| 成人免费在线观看网站| 亚洲AV成人片无码网站| 亚洲精品国产日韩无码AV永久免费网| 一区二区视频在线免费观看| 亚洲精品乱码久久久久久中文字幕 | 野花高清在线电影观看免费视频| 亚洲六月丁香婷婷综合| 最新69国产成人精品免费视频动漫| 亚洲a∨无码精品色午夜| 国产aⅴ无码专区亚洲av麻豆| 99免费视频观看| 亚洲男人的天堂网站| 亚洲精品成人a在线观看| 日本免费高清视频| 伊人久久五月丁香综合中文亚洲| 免费a级毛片网站| 伊人久久免费视频| 亚洲成a∧人片在线观看无码| 美腿丝袜亚洲综合| 91精品国产免费久久久久久青草| 亚洲精品精华液一区二区| 国产av无码专区亚洲av果冻传媒| 99久久99这里只有免费费精品 | 免费精品国偷自产在线在线| 国产午夜亚洲精品不卡| 无码乱人伦一区二区亚洲|