posts - 22, comments - 32, trackbacks - 0, articles - 73
            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理
           

          Hiberante3 一級緩存總結(jié)

          1.             Session 級別的緩存,它同session邦定。它的生命周期和session相同。Session消毀,它也同時(shí)消毀;管理一級緩存,一級緩存無法取消,用兩個(gè)方法管理,clear(),evict()

          2.             兩個(gè)session 不能共享一級緩存,因它會伴隨session的生命周期的創(chuàng)建和消毀;

          3.             Session緩存是實(shí)體級別的緩存,就是只有在查詢對象級別的時(shí)候才使用,如果

          使用HQLSQL是查詢屬性級別的,是不使用一級緩存的!切記?。。。?/span>

          4 .  iterate 查詢使用緩存,會發(fā)出查詢IdSQLHQL語句,但不會發(fā)出查實(shí)體的,

          它查詢完會把相應(yīng)的實(shí)體放到緩存里邊,一些實(shí)體查詢?nèi)绻彺胬镞呌校蛷木彺嬷胁樵儯€是會發(fā)出查詢idSQLHQL語句。如果緩存中沒有它會數(shù)據(jù)庫中查詢,然后將查詢到的實(shí)體一個(gè)一個(gè)放到緩存中去,所以會有N+1問題出現(xiàn)。

          5 . List()iterate 查詢區(qū)別:

          使用iterate,list查詢實(shí)體對象*N+1問題,在默認(rèn)情況下,使用query.iterate查詢,有可以能出現(xiàn)N+1問題

          所謂的N+1是在查詢的時(shí)候發(fā)出了N+1sql語句1:首先發(fā)出一條查詢對象id列表的sqlN:

          根據(jù)id列表到緩存中查詢,如果緩存中不存在與之匹配的數(shù)據(jù),那么會根據(jù)id發(fā)出相應(yīng)的sql語句listiterate的區(qū)別?

          list每次都會發(fā)出sql語句,list會向緩存中放入數(shù)據(jù),而不利用緩存中的數(shù)據(jù)

          iterate:在默認(rèn)情況下iterate利用緩存數(shù)據(jù),但如果緩存中不存在數(shù)據(jù)有可以能出現(xiàn)N+1問題

          6Get()load(),iterate方法都會使用一級緩存,

           

          7.hiberate3 session 存儲過程如下:

                 例如 object 對象

                 Session.save(object);

                 這時(shí)候不會把數(shù)據(jù)放到數(shù)據(jù)庫,會先放到session緩存中去,數(shù)據(jù)庫中沒有相應(yīng)記錄,session.flush();才發(fā)SQLHQL語句,數(shù)據(jù)庫中有了相應(yīng)記錄,

                 但是數(shù)據(jù)庫用select查不到,這是跟數(shù)據(jù)庫事物級別有關(guān)系,(這里在說下數(shù)據(jù)庫的事務(wù)隔離級別一共四種如下:)
              數(shù)據(jù)庫隔離級別:
                  隔離級別                       是否存在臟讀  是否存在不可重復(fù)讀     是否存在幻讀;
              Read UnCommited(未提交讀)               Y            Y                     Y
              Read Commited (提交讀 oraclel默認(rèn))      N            Y                     Y
              Repeatable Read(不可重復(fù)讀(Msql默認(rèn)))  N            N                     Y 
              Serializable(使用很少)                  N            N                     N

              


                 Session.beginTrransaction().commit();

                 事物提交后可以查詢到了。

          Session.flush()語句但是為什么不寫呢,因?yàn)?/span>commit()會默認(rèn)調(diào)用flush();


          Hiberante3 二級緩存總結(jié)

          1.Hibernate3的(sessionFactory)二級緩存和session級別的緩存一樣都只對實(shí)體對象做緩存,不對屬性級別的查詢做緩存;二級緩存的生命周期和sessionFactory的生命周期是一樣的,sessionFactory可以管理二級緩存;

          2.sessionFactory級別的緩存,需要手動(dòng)配置;所有的session可以共享sessionFactory 級別的緩存;(一般把一些不經(jīng)常變化的實(shí)體對象放到sessionFactory級別的緩存中,適合放不經(jīng)常變化的實(shí)體對象。)

          3.Hiberante3二級緩存的配置和使用方法如下:

          1. 必須把ehcache.jar包導(dǎo)入,然后到Hibernate3.2etc文件下把ehcache.xml復(fù)制到工程src目錄下(ehcache.xml里邊的參數(shù)里邊有詳細(xì)英文說明);

          (說明:ehcache.jar是第三方法的緩存產(chǎn)品,hiberante只是把它做了集成,還有好多第三方hibernate集成的緩存產(chǎn)品,相關(guān)說明請查閱hiberante3開發(fā)手冊;ehcache支持分布應(yīng)用的(這個(gè)和Hibernate3.2開發(fā)手冊有出入,經(jīng)過官網(wǎng)查證確實(shí)支持了),如果有分布式需求,請換成支持分布式的二級緩存產(chǎn)品,hiberate3開發(fā)手冊都有相頭說明。配置方法都類似);

          4.Hibernate3的二級緩存默認(rèn)是開起的,也可以指定開起。在hibernate.cfg.xml 文件下配置如下:

          *修改hibernate.cfg.xml文件,開戶二級緩存;

                               <property name=”hibernate.cache.use_second_level_cache”>true</property>

                               *指定二級緩存產(chǎn)品的提供商;

          <property name=”hibernate.cache.provider_class”> org.hibernate.cache.EhCacheProvider

          </property>

          要讓那些實(shí)體使用二級緩存,在hibernate.cfg.xml配置文件中加入:

          <!—

          讓這個(gè)實(shí)體用二級緩存 也可以在實(shí)體中映射文件去配置即:

          <cache usage="read-only"/>

          -->

          <class-cache class=”com.zzz.hibernate.ClassT” usage=”read-only”/>

          Read-only一般使用這個(gè)策略,其它的hibernate3開發(fā)手冊中也有詳細(xì)介紹;

          CacheModehibernate3開發(fā)手冊中搜索這個(gè)關(guān)鍵字,可以找到一級緩存和二級緩存交互使用的問題;


          評論

          # re: Hibernate3一級緩存和二級緩存的理解!  回復(fù)  更多評論   

          2009-08-12 09:38 by 隔葉黃鶯
          Ehcache 和 Oscache 現(xiàn)在都可以支持分布式緩存了。
          Ehcache 可通過 rmi/jms/jgroup 協(xié)議在節(jié)點(diǎn)間同步數(shù)據(jù),見 http://ehcache.sourceforge.net/documentation/distributed_design.html

          我也是記得原來的 Ehcache 是不支持分布式緩存,不過自從 1.2+ 開始, Ehcache 就支持分布式緩存了。

          # re: Hibernate3一級緩存和二級緩存的理解!  回復(fù)  更多評論   

          2009-08-12 12:26 by 凡客誠品
          卡世界的薩克達(dá)

          # re: Hibernate3一級緩存和二級緩存的理解!  回復(fù)  更多評論   

          2009-08-15 01:19 by 張釗釗
          你說的沒有錯(cuò),我去官網(wǎng)看了!EHcache.jar 從1.2.1后開始支持分布式了。
          Hibernate3.2 中的EHcache.jar 是1.2.3版本。我寫這個(gè)文章的時(shí)候是參考的是hibernate3.2 開發(fā)手冊,可能是這種開發(fā)手冊更新速度太慢。謝謝指出。

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 申扎县| 唐山市| 化隆| 阳信县| 冀州市| 昌都县| 峨眉山市| 锡林浩特市| 专栏| 滦平县| 肃宁县| 灯塔市| 宜阳县| 皋兰县| 潜江市| 龙口市| 内江市| 陵川县| 盱眙县| 竹山县| 武定县| 道孚县| 兴仁县| 胶南市| 黄龙县| 科技| 屯门区| 玉田县| 叙永县| 黄浦区| 呈贡县| 紫云| 德州市| 山阴县| 连云港市| 邹城市| 湘潭县| 泰安市| 鹰潭市| 清镇市| 千阳县|