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

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

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

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

    hibernate (十一 緩存Ehcache 采用annoation)

    Posted on 2009-08-24 17:09 瘋狂 閱讀(678) 評論(0)  編輯  收藏 所屬分類: hibernate

    從hibernate2.1開始ehcache已經作為hibernate的默認緩存方案(二級緩存方案 sessionfactory級別), 在項目中有針對性的使用緩存將對性能的提升右很大的幫助。

    要使用 Ehcache:需要一下步驟
    一,classpath添加相應的jar(ehcache,commons-logging)

    二,然后在hibernate.cfg.xml中配置

    <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
     <property name="cache.use_second_level_cache">true</property>
     <property name="cache.use_query_cache">true</property>

    說明:如果沒有配置<property name="cache.use_second_level_cache">true</property>(默認false) 將會產生根據單個id查詢的情況(產生很多sql)。

    三,為需要緩存的類添加緩存標示:

    使用mapping文件時需要添加node :

    @Entity
    @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)

     
    如果使用使用hibernate annoation是使用@Cache(usage=CacheConcurrencyStrategy.)標簽,有5種可選的緩存方案:

    1,CacheConcurrencyStrategy.NONE

                   不適用,默認

    2.  CacheConcurrencyStrategy.NONSTRICT_READ_WRITE

                   更新不頻繁幾個小時或更長

    3,CacheConcurrencyStrategy.READ_ONLY

                   對于不發生改變的數據使用

    4,CacheConcurrencyStrategy.READ_WRITE

                    基于時間戳判定機制,,對于數據同步要求嚴格的情況,使用頻繁

    5,CacheConcurrencyStrategy.TRANSACTIONAL

                     運行在jta環境種,基于事務


    四,在classpath下添加ehcache.xml

     

    寫道
    <ehcache>
     <diskStore path="java.io.tmpdir"/>
      <defaultCache
       maxElementsInMemory="10000" <!-- 緩存最大數目 -->
       eternal="false" <!-- 緩存是否持久 -->
       overflowToDisk="true" <!-- 是否保存到磁盤,當系統當機時-->
       timeToIdleSeconds="300" <!-- 當緩存閑置n秒后銷毀 -->
       timeToLiveSeconds="180" <!-- 當緩存存活n秒后銷毀-->
       diskPersistent="false"
       diskExpiryThreadIntervalSeconds= "120"/>
    </ehcache>

     

    測試:

    @Entity
    @Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
    public class B {
    private int id;
    private String bname;
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    public int getId() {
    return id;
    }
    public String getBname() {
    return bname;
    }
    ...
    }

     并配置到cfg文件中:<mapping class="com.eric.po.B" />
       main方法:

    public static void main(String[] args) throws Exception  {
    getTest();
    getTest();
    }
    public static void getTest() throws Exception {
      Session session = HibernateSessionFactory.getSession();
      Query q = session.createQuery("from B where id>?");
      q.setParameter(0, 10);
      q.setCacheable(true); 需要設置此屬性
      List list = q.list();
      for (Iterator iterator = list.iterator(); iterator.hasNext();) {
       B a2 = (B) iterator.next();
       System.out.print(a2.getId() + "/");
      }
      HibernateSessionFactory.closeSession();
     }

     控制臺信息:

    Hibernate: select b0_.id as id1_, b0_.bname as bname1_ from B b0_ where b0_.id>?
    11/14/18/25/26/27/28/29/Hibernate: select b0_.id as id1_, b0_.bname as bname1_ from B b0_ where b0_.id>?
    11/14/18/25/26/27/28/29/

     只發出了一次sql 第二次從緩存中取

     

     我們配置我們自己的緩存文件:

     

     <cache name="cache_a"
    maxElementsInMemory="5"
    eternal="false"
    timeToIdleSeconds="300"
    timeToLiveSeconds="600"
    overflowToDisk="true"
    />

    我們將maxElementsInMemory設置小一點 我們就可以看見磁盤的緩存文件:

     

       首先說明:我們在ehcache.xml  <diskStore path="java.io.tmpdir"/>配置了緩存溢出到的磁盤路徑

    可以通過:

    System.out.println(System.getProperty("java.io.tmpdir"));

     查詢。

    測試代碼:

    public static void main(String[] args) throws Exception  {
    System.out.println(System.getProperty("java.io.tmpdir"));
    getTest();
    getTest();
    Thread.sleep(10000);
    }

     我們在最后暫停10秒來查看磁盤文件
        

    public static void getTest() throws Exception {
    Session session = HibernateSessionFactory.getSession();
    Query q = session.createQuery("from B where id>?");
    q.setParameter(0, 10);
    q.setCacheable(true);
    q.setCacheRegion("cache_a");//使用我們自己配置的緩存
    List list = q.list();
    for (Iterator iterator = list.iterator(); iterator.hasNext();) {
    B a2 = (B) iterator.next();
    System.out.print(a2.getId() + "/");
    }
    HibernateSessionFactory.closeSession();
    }

     
    控制臺信息:

    C:\DOCUME~1\eric\LOCALS~1\Temp\           //我的java.io.tmpdir
    Hibernate: select b0_.id as id1_, b0_.bname as bname1_ from B b0_ where b0_.id>?
    11/14/18/25/26/27/28/29/Hibernate: select b0_.id as id1_, b0_.bname as bname1_ from B b0_ where b0_.id>?
    11/14/18/25/26/27/28/29/

     查看磁盤信息:

    在文件按目錄下有一下文件:
    com.eric.po.B.data--------0kb
    cache_a.data   ------------4 kb
    org.hibernate.cache.StandardQueryCache.data  ---0kb
    org.hibernate.cache.UpdateTimestampsCache.data -----0kb
    

     
    其中   cache_a中保存了我們的緩存文件

    StandardQueryCache.data 則是 設置默認的查詢緩存的數據過期策略  產生的文件

    org.hibernate.cache.UpdateTimestampsCache.data則是 設置時間戳緩存的數據過期策略 

    如果不適用我們自己的緩存配置就會使用類類的全路徑路徑文件(com.eric.po.B.data)來緩存我們的數據。

     

     

     

     

     



    主站蜘蛛池模板: 免费看片A级毛片免费看| 免费黄网站在线看| 女人被男人桶得好爽免费视频| 亚洲av色福利天堂| 四虎影视成人永久免费观看视频| 久久精品国产亚洲av四虎| 美女视频黄的免费视频网页 | 2020亚洲男人天堂精品| 毛片免费vip会员在线看| 亚洲色精品VR一区区三区| 午夜视频免费成人| 美女免费精品高清毛片在线视| 四虎影视永久免费视频观看| 黄色a级片免费看| 亚洲色成人中文字幕网站| 国产精品免费一区二区三区四区| 亚洲黄色中文字幕| 亚洲免费综合色在线视频| 亚洲av无码专区在线电影天堂| 免费一级特黄特色大片在线| 久久久WWW免费人成精品| 久久国产亚洲电影天堂| 中国人xxxxx69免费视频| 亚洲熟妇AV乱码在线观看| 国产gav成人免费播放视频| a级毛片免费高清视频| 久久精品国产亚洲AV无码娇色 | 免费看片在线观看| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 1000部免费啪啪十八未年禁止观看| 亚洲mv国产精品mv日本mv| 国产成人3p视频免费观看| 国产在线精品一区免费香蕉| 亚洲欧洲精品久久| 免费在线观看亚洲| 久久国产高潮流白浆免费观看| 亚洲中文字幕乱码AV波多JI| 2048亚洲精品国产| 欧洲乱码伦视频免费| 中文永久免费观看网站| 国产精品亚洲四区在线观看|