理解hibernate高速二級緩存區域

wangjianme 12年前發布 | 28K 次閱讀 緩存區域 Hibernate 持久層框架

Hibernate在不同的高速緩存區域(cache region)保存不同的類/集合。

    區域即是一個具有名稱的高速緩存塊,你可以給每一個高速緩存塊設置不同的緩存策略。如果沒有設置任何的緩存區域,

則所有被緩存的對象,都將使用默認的緩存策略。即:<defaultCache.../>

     對于類而言,區域的名稱是類名。如:cn.itcast.domain.Person(一般情況后面會跟一個.data)

     對于集合而言,區域的名稱是類名加屬性名。如cn.itcast.domain.Person.cars(一般情況,后面會跟一個.data)

  hibernate的配置屬性:hibernate.cache.region_prefix可以給每一個區域配置一個前綴的名稱。但這種情況一般發生在一個項目中

 有多個SessionFactory的情況。如果一個項目有多個SessionFactory則此配置也是必須的。

    以下是示例:ehcache的具名緩存區域配置示例:

    <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

         xsi:noNamespaceSchemaLocation="ehcache.xsd"

         updateCheck="true" monitoring="autodetect"

         dynamicConfig="true">

    <diskStore path="d:/a"/>     //指定文件保存路徑

    <defaultCache     //配置默認緩存區域,這是必須配置項。如果沒有給某個類設置緩存區域,它將使用默認緩存區域

        maxElementsInMemory="100"

        eternal="false"

        timeToIdleSeconds="120"

        timeToLiveSeconds="300"

        overflowToDisk="true"

        />

    <cache name="cn.itcast.domain.Person"  //指定Person類的緩存區域,所有Person類,都會保存在此區域

       maxElementsInMemory="2"           //故意指定內存中放很少的數據,以觀察生成的文件大小

        eternal="false"

        timeToIdleSeconds="120"

        timeToLiveSeconds="300"

        overflowToDisk="true"

        diskPersistent="true"

        diskExpiryThreadIntervalSeconds="120"

        maxElementsOnDisk="100"

        >

    </cache>

</ehcache>

   測試代碼:一次生成多個Person實例,看看生成的文件大小:

        Session s1 = HibernateUtils.openSession();   

       Person p1 = (Person) s1.get(Person.class,"11");

       Person p2 = (Person) s1.get(Person.class,"402880e 6346f 5ffe 01346f 6000b50000");

       Person p3 = (Person) s1.get(Person.class,"402880e6347311fa01347311fb 7c 0000");

       s1.close();
<!--[if !supportLineBreakNewLine]-->

1、理解高速查詢緩存區域</span> </h4>

     當某個查詢第一次執行時,它的結果被高速緩存在高速緩存區域--注意,這個區域不同于你可能已經配置的任何其他實例或

     集合高速緩存區域。這個區域的名稱默認為:org.hibernate.cache.StandardQueryCache

     可以通過setCacheRegion(...)方法,給一個特定的查詢改變高速緩存區域。

         hql = "from Person where name='JackB'";

       list = s.createQuery(hql)

              .setCacheable(true)

              .setCacheRegion("itcast")  //改變默認緩存查詢區域

              .list();

    或是顯示的設置一個查詢緩存區域,以觀察它的保存情況:

     <cache name="org.hibernate.cache.StandardQueryCache"   //必須叫這個名稱

       maxElementsInMemory="2"

        eternal="false"

        timeToIdleSeconds="120"

        timeToLiveSeconds="300"

        overflowToDisk="true"

        diskPersistent="true"

        diskExpiryThreadIntervalSeconds="120"

        maxElementsOnDisk="100"

        />

2、時間戳高速緩存區域

     如果查詢結果高速緩存被啟用,另一個始終需要的高速緩存區域也出現了:org.hibernate.cache.UpdateTimestampsCache

      這是Hibernate內部使用的一個高速緩存區域。Hibernate用時間戳來決定被高速緩存的結果集是否已經失效。


使用二級緩存的項目建議

    并非所有的類都可以受益于高速二級緩存,因為,能夠禁用高速二級緩存也很重要。重申一下,高速緩存通常只對于主要用來讀取的

類有用。如果你有更新比讀取更經常的數據,就不要啟用二級高速緩存,即使所有其他的高速緩存條件都符合!

更新期間,維護高速緩存的代價可能遠遠超出更快讀取的性能受益。




o:p/o:p</span>

<!--[endif]-->

 本文由用戶 wangjianme 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!