關於hibernate的cache總結及並發問題


緩存按應用范圍可分為三類:

事物級緩存即一級緩存session緩存:

         存儲的當前session相關聯java對象

                  session緩存稱為hibernate的一級緩存

         應用級緩存即二級緩存sessionFactory:

                   二級緩存根據目的和功能又可分為內置緩存和外置緩存。

                   內置緩存放置的是映射元數據和預定義SQL語句,內置緩存是只讀的,不可修改。

                   外置緩存是一個可配置的插件,在默認情況hibernate不會開啟這個插件。

                   外置緩存的存儲介質是內存或硬盤。

                   SessionFactory的外置緩存被稱為hibernate的二級緩存。

      hibernate本身只提供二級緩存的規范,有第三方插件做具體實現。EHCache。

      二級緩存存儲的對象分為:

        類對象

        集合對象

        query查詢對象

        集群范圍緩存

 

EHCache緩存在hibernate中的使用;

   1.在主配置文件中要開啟二級緩存:

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

   2.在主配置文件配置二級緩存區工廠:

            <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

   3.指定緩存對象(可在映射關系中配置也可在主配置文件中配置)

         0.導入Jar包和配置文件

          

         1.<class-cache usage="read-only" class="指定的對象類"/>(主配置文件中配置)

         2. <collection-cache usage="read-only" collection="指定的集合對象"/>(主配置文件中配置)

<!-- 指定類緩存集合 -->
<class-cache usage="read-only" class="com.layne.beans.Minister"/>
<class-cache usage="read-only" class="com.layne.beans.Country"/>
<!-- 指定集合緩存集合 -->
<collection-cache usage="read-only" collection="com.layne.beans.Country.ministers"/>

在映射關系配置文件中配置

 <class name="Country">
           <!-- 指定當前類為類緩存對象 -->
           <!-- <cache usage="read-only"/> -->
           <id name="cid">
              <generator class="native"></generator>
           </id>
           <property name="cname"/>
           <!-- 對關系關聯映射關系 -->
           <set name="ministers" cascade="save-update" inverse="false">
              <!-- 指定當前集合為緩存對象 -->
             <!--  <cache usage="read-only"/> -->
              <key column="countryId"/>
              <one-to-many class="Minister"/>
           </set>
     </class>

       3.配置query查詢緩存對象

        在主配置文件中開啟query緩存:<property name="hibernate.cache.use_query_cache">true</property>

           query查詢的結果也是可以存到一二級緩存中,但Query查詢默認不會從緩存中讀取數據     

            要使用Query讀取緩存數據
           1.在Hibernate.cfg.xml配置hibernate.cache.use_query_cache為true
           2.要在Query語句添加 setCacheable(true):

                     Country country= (Country) session.createQuery(hql).setCacheable(true).uniqueResult();

Session的刷新與同步

     Session的刷新是指,Session緩存中數據的更新。

    Session的同步是指,將Session緩存中的數據同步更行到DB中。

    執行同步的時間點只有一個:事物的提交。

    刷新的時間點有三個:1.執行Query查詢 2.執行Session.flush() 3.執行事物的提交

 

    當代碼中執行了對Session中現有數據的修改操作,即update()與delete()語句后,

            Session緩存並不會馬上刷新。即並不會馬上執行update與delete的SQL語句。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM