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

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

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

    隨筆-199  評論-203  文章-11  trackbacks-0

    (一)Hibernate的二級緩存策略的一般過程如下:

    1) 條件查詢的時候,總是發(fā)出一條select * from table_name where …. (選擇所有字段)這樣的SQL語句查詢數據庫,一次獲得所有的數據對象。

    2) 把獲得的所有數據對象根據ID放入到第二級緩存中。

    3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;查不到,再查詢數據庫,把結果按照ID放入到緩存。

    4) 刪除、更新、增加數據的時候,同時更新緩存。

    Hibernate的二級緩存策略,是針對于ID查詢的緩存策略,對于條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。

    (二)什么樣的數據適合存放到第二級緩存中?

    1 很少被修改的數據

    2 不是很重要的數據,允許出現偶爾并發(fā)的數據

    3 不會被并發(fā)訪問的數據

    4 參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改。

    (三)不適合存放到第二級緩存的數據?

    1 經常被修改的數據

    2 財務數據,絕對不允許出現并發(fā)

    3 與其他應用共享的數據。

    實踐部分:

    使用EhCache配置二級緩存

    配置準備:

    1)把ehcache-1.2.3.jar加入到當前應用的classpath中。

    2)在hibernate.cfg.xml文件中加入EhCache緩存插件的提供類。

    1. <!--配置緩存插件 -->   
    2. <property name="hibernate.cache.provider_class">   
    3.     org.hibernate.cache.EhCacheProvider   
    4. </property>  

    3)挎貝ehcache.xml文件到類路徑(項目工程的src目錄下),這個文件在Hibernate安裝目錄的etc下。

    配置步驟:

    Hibernate允許在類和集合的粒度上設置第二級緩存。在映射文件中,<class>和<set>元素都有一個<cache>子元素,這個子元素用來配置二級緩存。
    示例:以category(產品類別)和product(產品)的映射為例:

    1) 修改要配置緩存的那個持久化類的對象關系映射文件:

    Category.hbm.xml

    <?xml version="1.0" encoding="utf-8"?>  

    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    " <hibernate-mapping>  
        <class name="org.qiujy.domain.cachedemo.Category" table="categories">  
           <!—  
                 配置緩存,必須緊跟在class元素后面  
                對緩存中的Category對象采用讀寫型的并發(fā)訪問策略  
            -->  
           <cache usage="read-write"/>  
            
           <id name="id" type="java.lang.Long">  
               <column name="id" />  
               <generator class="native" />  
           </id>  
           <!-- 配置版本號,必須緊跟在id元素后面 -->  
           <version name="version" column="version" type="java.lang.Long" />  
            
           <property name="name" type="java.lang.String">  
               <column name="name" length="32" not-null="true"/>  
           </property>  
            
           <property name="description" type="java.lang.String">  
               <column name="description" length="255"/>  
           </property>  
            
           <set name="products" table="products" cascade="all" inverse="true">  
               <!-- Hibernate只會緩存對象的簡單屬性的值,  
           要緩存集合屬性,必須在集合元素中也加入<cache>子元素  
           而Hibernate僅僅是把與當前持久對象關聯的對象的OID存放到緩存中。  
    如果希望把整個關聯的對象的所有數據都存入緩存,  
    則要在相應關聯的對象的映射文件中配置<cache>元素  
               -->  
               <cache usage="read-write"/>  
                
               <key column="categoryId" not-null="true"/>  
               <one-to-many class="org.qiujy.domain.cachedemo.Product"/>  
           </set>  
            
        </class>  
    </hibernate-mapping>

    Product.hbm.xml

    <?xml version="1.0" encoding="utf-8"?>  
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    " <hibernate-mapping>  
        <class name="org.qiujy.domain.cachedemo.Product" table="products">  
            
           <cache usage="read-write"/>  
            
           <id name="id" type="java.lang.Long">  
               <column name="id" />  
               <generator class="native" />  
           </id>  
           <!-- 配置版本號,必須緊跟在id元素后面 -->  
           <version name="version" column="version" type="java.lang.Long" />  
            
           <property name="name" type="java.lang.String">  
               <column name="name" length="32" not-null="true"/>  
           </property>  
            
           <property name="description" type="java.lang.String">  
               <column name="description" length="255"/>  
           </property>  
            
           <property name="unitCost" type="java.lang.Double">  
               <column name="unitCost" />  
           </property>  
            
           <property name="pubTime" type="java.util.Date">  
               <column name="pubTime" not-null="true" />  
           </property>  
            
           <many-to-one name="category"  
                    column="categoryId"  
                   class="org.qiujy.domain.cachedemo.Category"  
                   cascade="save-update"  
                    not-null="true">  
            </many-to-one>  
            
        </class>  
    </hibernate-mapping>

    2)編輯ehcache.xml文件:

    <ehcache>  
        <diskStore path="c:\\ehcache\"/>  
        <defaultCache  
            maxElementsInMemory="10000"  
            eternal="false"  
            timeToIdleSeconds="120"  
            timeToLiveSeconds="120"  
            overflowToDisk="true"    
            />  
             
        <!-- 設置Category類的緩存的數據過期策略 -->  
        <cache name="org.qiujy.domain.cachedemo.Category"  
            maxElementsInMemory="100"  
            eternal="true"  
            timeToIdleSeconds="0"  
            timeToLiveSeconds="0"  
            overflowToDisk="false"  
            />  
             
         <!-- 設置Category類的products集合的緩存的數據過期策略 -->  
         <cache name="org.qiujy.domain.cachedemo.Category.products"  
            maxElementsInMemory="500"  
            eternal="false"  
            timeToIdleSeconds="300"  
            timeToLiveSeconds="600"  
            overflowToDisk="true"  
            />  
             
        <cache name="org.qiujy.domain.cachedemo.Product"  
            maxElementsInMemory="500"  
            eternal="false"  
            timeToIdleSeconds="300"  
            timeToLiveSeconds="600"  
            overflowToDisk="true"  
            />  
         
    </ehcache>

    在Spring托管的Hibernate中使用二級緩存 1.在spring的配置文件中,hibernate部分加入 xml 代碼 org.hibernate.cache.EhCacheProvider true 2.為HBM表設置cache策略 xml 代碼 3.在DAO中,調用find方法查詢之前,設置使用緩存 Java代碼 getHibernateTemplate().setCacheQueries(true); 補充: 如果不設置“查詢緩存”,那么hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的數據結果集的話,就需要設置 hibernate.cache.use_query_cache true 才行。

    posted on 2009-06-23 17:32 Werther 閱讀(1698) 評論(2)  編輯  收藏 所屬分類: 21.Hibernate

    評論:
    # re: Hibernate中二級緩存的配置和使用 2009-06-24 20:22 | 心夢帆影
    學習了,謝謝你這么好的文章。有個問題想請教一下:
    “并發(fā)訪問的數據”是什么意思?多個人同時訪問同一數據是不是并發(fā)訪問?  回復  更多評論
      
    # re: Hibernate中二級緩存的配置和使用 2009-06-24 21:25 | Werther
    @心夢帆影
    同時訪問一種資源的用戶被視為并發(fā)訪問數據,也就是你所說的,多個人同時訪問同一個數據.  回復  更多評論
      
    主站蜘蛛池模板: 久久综合久久综合亚洲| 羞羞视频免费网站含羞草| 四虎成人免费网址在线| 日韩精品无码永久免费网站| 精品亚洲一区二区| 91成人免费观看网站| 美女扒开屁股让男人桶爽免费| 国产成人A人亚洲精品无码| 亚洲免费网站观看视频| CAOPORM国产精品视频免费| 亚洲成av人片在线看片| 国产成人涩涩涩视频在线观看免费| 久久久精品国产亚洲成人满18免费网站| 亚洲精品无码久久毛片波多野吉衣| 国产男女猛烈无遮挡免费视频网站 | 性xxxx视频播放免费| aa在线免费观看| 亚洲综合色一区二区三区| 国产AV无码专区亚洲AV毛网站| 日韩高清免费在线观看| 97av免费视频| 黄色网页在线免费观看| 亚洲精品色播一区二区| 无码乱人伦一区二区亚洲一| 免费国产成人午夜私人影视| 在线观看免费人成视频色9| 你懂得的在线观看免费视频| 男人的天堂av亚洲一区2区| 久久亚洲精品无码aⅴ大香| 在线观看亚洲av每日更新| 大地资源二在线观看免费高清| 久久精品成人免费网站| 日本精品久久久久久久久免费 | 亚洲heyzo专区无码综合| 亚洲专区在线视频| 亚洲综合无码AV一区二区 | 色视频色露露永久免费观看| 免费在线观看h片| 久草免费手机视频| 国产精品高清免费网站| 特级一级毛片免费看|