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

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

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

    空間站

    北極心空

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
    hibernate3.2二級緩存的配置及測試(ehcache)

     

    1.配置ehcache.xml文件,放到classpath下:

     <?xml version="1.0" encoding="GBK"?>
          <ehcache>       
                 <diskStore path="D:\\TempObject"/>             
                 <defaultCache                      
                           maxElementsInMemory="10000"                     
                           eternal="false"                       
                           timeToIdleSeconds="100"                 
                           timeToLiveSeconds="1000"             
                          overflowToDisk="true"           
                  />          
                  <cache name="com.sitechasia.occ.core.base.ExampleForTest"                                                                                    maxElementsInMemory="10000"                      
                          eternal="false"                      
                          timeToIdleSeconds="100"                     
                          timeToLiveSeconds="1000"                      
                          overflowToDisk="true"               
                   />  
        </ehcache>
    建議自定義cache時,cache名字和類路徑名相同。
    (1)不要使用默認緩存策略defaultCache(多個class共享)
    (2)不要給cache name另外起名
    否則繼承AbstractTransactionalDataSourceSpringContextTests做測試時,拋出
    org.hibernate.cache.CacheException: java.lang.IllegalStateException: The com.sitechasia.occ.core.base.ExampleForTest Cache is not alive.(我注釋了紅色的cache,使用defaultCache導致)

    2.在ExampleForTest.hbm.xml中添加:(如果有集合,也需要添加)

    <hibernate-mapping>
        <class name="com.sitechasia.occ.core.base.ExampleForTest"
            table="TESTTABLE" lazy="false">
            <cache usage="read-write"/>
            <id name="id" type="java.lang.String">
                <column name="id" length="32" />
                <generator class="uuid"></generator>
            </id>
            <property name="field1" type="java.lang.String" />
            <property name="field2" type="java.lang.String" />
        </class>
    </hibernate-mapping>
    如果使用Annocation,則類前添加
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
    @Proxy(lazy = false)

    3.在spring.xml中添加:
    <property name="hibernateProperties">
                <props>
                    <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                    <prop key="hibernate.show_sql">true</prop>
                    <!--  使用hibernate自帶cache,適合測試用
                        <prop key="hibernate.cache.provider_class">
                              org.hibernate.cache.HashtableCacheProvider
                        </prop>
                    -->
                    <!--  使用ehcache,適合項目用 -->
                    <prop key="hibernate.cache.provider_class">
                        org.hibernate.cache.EhCacheProvider
                    </prop>
                    <!--  打開hibernate統(tǒng)計功能,我們測試中使用hibernate的統(tǒng)計類-->
                    <prop key="hibernate.generate_statistics">true</prop>
                    <!--  最優(yōu)化二級緩存-->
                    <prop key="hibernate.cache.use_structured_entries">
                        true
                    </prop>
                    <!--  完全禁用二級緩存開關(guān),對那些在類的映射定義中指定cache的類,默認開啟二級緩存-->
                    <prop key="cache.use_second_level_cache">true</prop>
                    <!-- prop key="hibernate.hbm2ddl.auto">create</prop>
                        <prop key="hibernate.default_schema">
                        ${dbunit.schema}
                        </prop>
                    -->
                </props>
            </property>
    4.配置完了,我們可以測試了:
    測試類繼承spring的測試組件AbstractTransactionalDataSourceSpringContextTests類;
    先初始化數(shù)據(jù):
    private ExampleForTest example1, example2;
    public void onSetUpBeforeTransaction() {
            example1 = new ExampleForTest();
            example1.setField1("param1");
            example1.setField2("param2");
            example2 = new ExampleForTest();
            example2.setField1("attribute1");
            example2.setField2("attribute2");
        }
    再寫測試方法:
    exampleDao中有2個方法:
    (1)list方式獲取參數(shù):(對二級緩存只寫不讀)
    exampleDao.findByHQL(hql);
    (2)iterate方式獲取參數(shù):(對二級緩存可寫可讀)
    exampleDao.cacheByHQL(hql);
    測試(2)方法:
    public void testCacheByHQL() {

            /**先打開注釋,往數(shù)據(jù)庫增加2條數(shù)據(jù),然后關(guān)閉
            exampleDao.save(example1);
            exampleDao.save(example2);
            setComplete();
            */
            String hql = "from ExampleForTest";
            //List list = exampleDao.findByHQL(hql); //開關(guān)控制
            List<ExampleForTest> iterate = exampleDao.cacheByHQL(hql);
            Statistics statistics = sessionFactory.getStatistics();
            // 統(tǒng)計entity信息
            for (int i = 0; i < statistics.getEntityNames().length; i++) {
                String entityName = statistics.getEntityNames()[i];
                System.out.println("entityName:" + entityName);
                EntityStatistics entityStatistics = statistics
                        .getEntityStatistics(entityName);
                System.out.println("entityStatistics:" + entityStatistics);
            }
            assertEquals(2, iterate.size());
        }
    1》注釋開關(guān)控制代碼行,iterate獲取數(shù)據(jù),發(fā)現(xiàn)有N+1問題,說明是從數(shù)據(jù)庫讀取的數(shù)據(jù),日志如下:
    Hibernate: select examplefor0_.id as col_0_0_ from TESTTABLE examplefor0_
    Hibernate: select examplefor0_.id as id0_0_, examplefor0_.field1 as field2_0_0_, examplefor0_.field2 as field3_0_0_ from TESTTABLE examplefor0_ where examplefor0_.id=?
    Hibernate: select examplefor0_.id as id0_0_, examplefor0_.field1 as field2_0_0_, examplefor0_.field2 as field3_0_0_ from TESTTABLE examplefor0_ where examplefor0_.id=?
    entityName:com.sitechasia.occ.core.base.ExampleForTest
    entityStatistics:EntityStatistics[loadCount=2,updateCount=0,insertCount=0,deleteCount=0,fetchCount=2,optimisticLockFailureCount=0]
    2》打開開關(guān)控制代碼行注釋,先list方式讀取數(shù)據(jù),會寫入二級緩存,再用iterate獲取數(shù)據(jù)時,發(fā)現(xiàn)沒有了N+1問題,說明是從二級緩存中讀取的數(shù)據(jù),日志如下:
    Hibernate: select examplefor0_.id as id0_, examplefor0_.field1 as field2_0_, examplefor0_.field2 as field3_0_ from TESTTABLE examplefor0_
    Hibernate: select examplefor0_.id as col_0_0_ from TESTTABLE examplefor0_
    entityName:com.sitechasia.occ.core.base.ExampleForTest
    entityStatistics:EntityStatistics[loadCount=2,updateCount=0,insertCount=0,deleteCount=0,fetchCount=0,optimisticLockFailureCount=0]

    5.需要注意的是,實體映射文件中l(wèi)azy=false必須設置,即立即加載;否則后臺日志不打印那N條通過id獲取實體的sql,無法判斷是否使用二級緩存。
    posted on 2008-10-14 18:07 蘆葦 閱讀(2782) 評論(0)  編輯  收藏 所屬分類: Hibernate
    主站蜘蛛池模板: 亚洲av之男人的天堂网站| 成全视频在线观看免费高清动漫视频下载 | 99久久国产热无码精品免费| 日本高清免费中文在线看| 亚洲国产日产无码精品| 无码人妻久久一区二区三区免费丨 | kk4kk免费视频毛片| 亚洲成AV人片一区二区密柚| 国产精品色午夜免费视频| 精品国产无限资源免费观看| 日本一区午夜艳熟免费| 欧亚一级毛片免费看| 亚洲国产精品无码久久| 亚洲综合伊人久久大杳蕉| 国产在线观看免费视频播放器| 999国内精品永久免费视频| 伊人久久免费视频| 美女视频黄的免费视频网页| 亚洲同性男gay网站在线观看| 亚洲成AV人片一区二区密柚| 国产成人麻豆亚洲综合无码精品 | 中文文字幕文字幕亚洲色| 久久狠狠高潮亚洲精品| 成人免费视频网址| 久久久久久免费视频| 精品乱子伦一区二区三区高清免费播放| 久久亚洲国产精品成人AV秋霞| 午夜高清免费在线观看| 无码人妻久久一区二区三区免费丨 | 免费在线观看a级毛片| 91人成网站色www免费下载| 久久精品亚洲日本波多野结衣| 亚洲国产精品综合久久20| 亚洲13又紧又嫩又水多| 国产精品亚洲mnbav网站| 啦啦啦高清视频在线观看免费| 日韩视频在线精品视频免费观看| 97碰公开在线观看免费视频| 国色精品卡一卡2卡3卡4卡免费 | 亚洲av永久中文无码精品综合| 亚洲欧美日韩一区二区三区在线|