隨筆-4  評(píng)論-7  文章-0  trackbacks-0

          Hibernate在進(jìn)行數(shù)據(jù)讀取時(shí)會(huì)先在緩存里找,緩存中不存在時(shí)再去數(shù)據(jù)庫(kù)查詢,合理使用hibernate緩存能夠有效的利用內(nèi)存,減少物理數(shù)據(jù)庫(kù)調(diào)用的次數(shù).

           

          ORM緩存策略

          1.事務(wù)級(jí)緩存(session level cache)

          session生命周期的緩存,關(guān)閉session即消亡

          2.應(yīng)用級(jí)/進(jìn)程級(jí)緩存(sessionFactory level cache)

          某個(gè)應(yīng)用中的共享緩存,多個(gè)事務(wù)可以共享,在sessionFactory層實(shí)現(xiàn),所有sessionFactory創(chuàng)建的session可以共享.

          3.分布式緩存

          多個(gè)JVM共享的緩存,通過遠(yuǎn)程機(jī)制實(shí)現(xiàn)緩存數(shù)據(jù)同步,任意實(shí)例修改數(shù)據(jù),所有的JVM都要更新緩存.

           

          Hibernate數(shù)據(jù)緩存

          1.內(nèi)部緩存(session level)一級(jí)緩存

          是事務(wù)級(jí)的緩存,session中維護(hù)的一個(gè)Map,Map的key是包含了數(shù)據(jù)類型和id,從數(shù)據(jù)庫(kù)加載的數(shù)據(jù)都會(huì)進(jìn)入Map緩存中,通過session加載數(shù)據(jù)時(shí)會(huì)先在session緩存里找,一級(jí)緩存是session的private數(shù)據(jù),session實(shí)例消亡就清除了,在應(yīng)用中就保持在一次請(qǐng)求的開始和結(jié)束之間.

          一般由Hibernate自動(dòng)維護(hù),也支持手動(dòng)維護(hù)

          session.evit(Object obj) 將持久化對(duì)象從一級(jí)緩存中清除.

          session.clear()  清空一級(jí)緩存

          session.contains(Object obj) 判斷指定的對(duì)象是否存在于一級(jí)緩存中. 

          session.flush() 刷新一級(jí)緩存區(qū)的內(nèi)容,使緩存與數(shù)據(jù)庫(kù)數(shù)據(jù)保持同步. 

           

          2.二級(jí)緩存(sessionFactory level)

          包含了應(yīng)用級(jí)和分布式的緩存,由本sessionFactory的所有session實(shí)例共享,session操作時(shí)會(huì)先查一級(jí)緩存,然后查二級(jí)緩存,最后再查物理數(shù)據(jù)庫(kù).要使用二級(jí)緩存必須要進(jìn)行配置.

           

          適合用緩存的數(shù)據(jù)

          1.不會(huì)被其他應(yīng)用修改

          包括直接用JDBC修改等,因?yàn)槠渌麘?yīng)用修改了數(shù)據(jù)之后hibernate并不知道,不能自動(dòng)更新緩存,不過可以手動(dòng)更新緩存

          2.數(shù)據(jù)大小可以接受,畢竟內(nèi)存資源也不多

          3.數(shù)據(jù)更新頻率低(比如數(shù)據(jù)字典等常量數(shù)據(jù))

          4.可能被系統(tǒng)頻繁使用

          5.非關(guān)鍵的數(shù)據(jù)

          6.不會(huì)被并發(fā)訪問的數(shù)據(jù)

           

          常用的二級(jí)緩存插件

          EHCache  org.hibernate.cache.EhCacheProvider 

          OSCache  org.hibernate.cache.OSCacheProvider 

          SwarmCahe  org.hibernate.cache.SwarmCacheProvider 提供了分布式

          JBossCache  org.hibernate.cache.TreeCacheProvider 提供了分布式

           

          EHCache二級(jí)緩存配置方法

          1.啟用二級(jí)緩存首先要在hibernate.cfg.xml配置

          <hibernate-configuration>  

             <session-factory>  

                <!-- 配置二級(jí)緩存插件EHCache的Provider類-->  

                <property name="hibernate.cache.provider_class">  

                   org.hibernate.cache.EhCacheProvider  

                </property>  

                <!-- 啟動(dòng)"查詢緩存" -->  

                <property name="hibernate.cache.use_query_cache">  

                   true  

                </property>  

             </session-factory>  

           </hibernate-configuration> 

           

          2.然后配置cache的配置文件ehcache.xml

          <ehcache>  

            <!-- maxElementsInMemory為緩存對(duì)象的最大數(shù)目,

          eternal設(shè)置是否永遠(yuǎn)不過期,

          timeToIdleSeconds對(duì)象處于空閑狀態(tài)的最多秒數(shù),

          timeToLiveSeconds對(duì)象處于緩存狀態(tài)的最多秒數(shù),

          overflowtodisk內(nèi)存不足時(shí)是否啟用磁盤緩存 -->  

            <diskStore path="java.io.tmpdir"/>  

            <defaultCache maxElementsInMemory="10000" eternal="false"  timeToIdleSeconds="300"            timeToLiveSeconds="600" overflowToDisk="true"/>

          </ehcache>

           

          3.最后要在映射文件***.hbm.xml中指定實(shí)體的緩存同步策略

          <?xml version="1.0" encoding='UTF-8'?>  

          <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 

          "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  

          <hibernate-mapping>  

             <class>  

                 <!-- 設(shè)置該持久化類的二級(jí)緩存并發(fā)訪問策略-->  

                 <cache usage="read-write"/>

          <set name = "xxx">

          <cache usage="read-only" />

              </set>

             </class>

          </hibernate-mapping>  

           

          hibernate提供的緩存同步策略,可以在usage中設(shè)置

          read-only

          只讀

          nonstrict-read-write

          更新頻率不高

          read-write

          嚴(yán)格可讀寫

          transactional(Ecache不支持)

          事務(wù)型緩存

          posted on 2010-08-22 23:22 wkkyo 閱讀(449) 評(píng)論(0)  編輯  收藏 所屬分類: Hibernate

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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 广东省| 盘山县| 同江市| 平江县| 许昌市| 米脂县| 安丘市| 乌拉特中旗| 如东县| 榆林市| 锡林浩特市| 清镇市| 西城区| 揭阳市| 噶尔县| 鄯善县| 安平县| 宣武区| 湟源县| 垫江县| 南宁市| 龙江县| 五寨县| 日照市| 涞源县| 越西县| 崇仁县| 西盟| 黄骅市| 青河县| 连城县| 万山特区| 利津县| 大荔县| 霍山县| 靖江市| 黔西县| 电白县| 襄汾县| 孙吴县| 长葛市|