Hibernate 二級緩存 總結整理

和《Hibernate 關係映射 收集、總結整理》 一樣,本篇文章也是我很早之前收集、總結整理的,在此也發上來 希望對大家有用。因爲是很早之前寫的,不當之處請指正。

 

1、緩存:緩存是什麼,解決什麼問題?

位於速度相差較大的兩種硬件/軟件之間的,用於協調兩者數據傳輸速度差異的結構,均可稱之爲 Cache(摘自Robbin的《緩存技術淺談》)。目的:讓數據更接近於應用程序,協調速度不匹配,使訪問速度更快。(請參考http://baike.baidu.com/view/907.htm 瞭解更多緩存知識)

    高速緩存不屬於Hibernate等,屬於獨立產品或框架,可單獨使用。

 

常見緩存算法:

a)         LFU(Least Frequently Used):最近不常被使用(命中率低),一定時間段內使用次數最少的

b)        LRU(Least Recently Used):最近很少使用(LinkedHashMap),沒有被使用時間最長的

c)        FIFO(First In First Out):先進先出

 

2、緩存策略

1.對象緩存

2.查詢緩存

3.頁面緩存

1.動態頁面緩存

2.Servlet緩存

3.頁面片段緩存

 

3、緩存分類

    1.         Web緩存:

                     i.              瀏覽器緩存:ajax(在客戶端緩存)、HTTP協議

                     ii.          代理服務器緩存

    2.       操作系統緩存:如用於減少磁盤操作

    3.        數據庫緩存:

                         i.              結果緩存:

                         ii.             排序緩存

                         iii.            插入緩存

                         iv.            日誌緩存

                         v.              ………………

    4.         應用程序緩存

                        i.              對象緩存

                         ii.              查詢緩存

                         iii.              頁面緩存

                             1.         動態頁面靜態化:網頁靜態化、獨立圖片服務器

                             2.         頁面局部緩存:

                             3.        請求迴應緩存:

 

4、常見Java緩存框架

    §           EHCache

    §           OSCache

    §           JBossCache

    §           SwarmCache

 

5、通用緩存產品

    §           Memcached:在大規模互聯網應用下使用,可用於分佈式環境,每秒支撐1.5萬~2萬次請求

    §           Tokyo Tyrant:兼容memcached協議,可以持久化存儲,支持故障切換,對緩存服務器有高可靠性要求可以使用,每秒支撐0.5萬~0.8萬次請求

 

6、基於Web應用的緩存應用場景:


(摘自bluedavy的《大型網站架構演化》)

8、緩存實戰:

8.4、ORM緩存

8.4.1、目的:

Hibernate緩存:使當前數據庫狀態的表示接近應用程序,要麼在內存中,要麼在應用程序服務器機器的磁盤上。高速緩存是數據的一個本地副本,處於應用程序和數據庫之間,可用來避免數據庫的命中。

8.4.2、避免數據庫命中:

應用程序根據標識符到緩存查,有就返回,沒有再去數據庫.

8.4.3、ORM緩存分類

一級緩存、二級緩存

8.4.4、緩存範圍

1、事務範圍高速緩存,對應於一級緩存(單Session)

       2、過程(JVM)範圍高速緩存,對應於二級緩存(單SessionFactory)

              3、集羣範圍高速緩存,對應於二級緩存(多SessionFactory)

8.4.5、緩存哪些數據

              1、很少改變的數據;

2、不重要的數據,如論壇帖子,無需實時的數據;

              3、應用程序固有的而非共享的。

              4、讀大於寫有用

 

 

8.4.6、Hibernate緩存架構


圖摘自《Hibernate in Action》

§           Hibernate中的二級緩存是可插拔的。

§           Hibernate二級緩存支持對象緩存、集合緩存、查詢結果集緩存,對於查詢結果集緩存可選。

§           查詢緩存:需要兩個額外的物理高速緩存區域:一個用於存放查詢的結果集;另一個用於存儲表上次更新的時間戳

 


 

8.4.6.2、高速緩存實戰(ehcache)

8.4.6.2.1、全局配置(hibernate.cfg.xml)
Java代碼  收藏代碼

    <!-- 開啓二級緩存 -->  
    <property name="hibernate.cache.use_second_level_cache">true</property>  
    <!-- 開啓查詢緩存 -->  
    <property name="hibernate.cache.use_query_cache">true</property>  
    <!-- 二級緩存區域名的前綴 -->  
    <!--<property name="hibernate.cache.region_prefix">h3test</property>-->  
    <!-- 高速緩存提供程序 -->  
    <property name="hibernate.cache.region.factory_class">  
    net.sf.ehcache.hibernate.EhCacheRegionFactory  
    </property>  
    <!-- 指定緩存配置文件位置 -->  
    <property name="hibernate.cache.provider_configuration_file_resource_path">  
    ehcache.xml  
    </property>  
    <!-- 強制Hibernate以更人性化的格式將數據存入二級緩存 -->  
    <property name="hibernate.cache.use_structured_entries">true</property>  
      
    <!-- Hibernate將收集有助於性能調節的統計數據 -->  
    <property name="hibernate.generate_statistics">true</property>  

 

 8.4.6.2.2、ehcache配置(ehcache.xml)
Java代碼  收藏代碼

    <?xml version="1.0" encoding="UTF-8"?>  
    <ehcache name="h3test">  
       <defaultCache  
          maxElementsInMemory="100"  
          eternal="false"  
          timeToIdleSeconds="1200"  
          timeToLiveSeconds="1200"  
          overflowToDisk="false">  
        </defaultCache>  
    </ehcache>  

 

 8.4.6.2.3、實體只讀緩存

1、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並只讀
Java代碼  收藏代碼

    <hibernate-mapping>  
        <class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM">  
            <cache usage="read-only"/>  
        ……  
    </hibernate-mapping>  

 

 2、測試代碼
Java代碼  收藏代碼

    public static void readonlyTest() {  
          SessionFactory sf =   
    new Configuration().configure().buildSessionFactory();  
              
          Session session1 = sf.openSession();  
          Transaction t1 = session1.beginTransaction();  
          //確保數據庫中有標識符爲1的FarmModel  
          FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1);  
          //如果修改將報錯,只讀緩存不允許修改  
          //farm.setName("aaa");  
          t1.commit();  
         session1.close();  
              
              
          Session session2 = sf.openSession();  
          Transaction t2 = session2.beginTransaction();  
              
          farm = (FarmModel) session2.get(FarmModel.class, 1);  
              
          t2.commit();  
          session2.close();  
          sf.close();  
    }  

 

   §           只讀緩存不允許更新,將報錯Can't write to a readonly object。

   §           允許新增,(現在2。0 新增直接添加到二級緩存)

 

8.4.6.2.4、實體非嚴格讀/寫緩存

 

1、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並非嚴格讀/寫
Java代碼  收藏代碼

    <hibernate-mapping>  
        <class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM">  
            <cache usage="nonstrict-read-write"/>  
        ……  
    </hibernate-mapping>  

 

 2、測試代碼
Java代碼  收藏代碼

    public static void nonstrictReadWriteTest () {  
          SessionFactory sf =   
    new Configuration().configure().buildSessionFactory();  
              
          Session session1 = sf.openSession();  
          Transaction t1 = session1.beginTransaction();  
          //確保數據庫中有標識符爲1的FarmModel  
          FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1);  
          t1.commit();  
         session1.close();  
              
              
          Session session2 = sf.openSession();  
          Transaction t2 = session2.beginTransaction();  
              
          farm = (FarmModel) session2.get(FarmModel.class, 1);  
              
          t2.commit();  
          session2.close();  
          sf.close();  
    }  

       §           允許更新,更新後緩存失效,需再查詢一次。

       §           允許新增,新增記錄自動加到二級緩存中。

       §           整個過程不加鎖,不保證。

 

8.4.6.2.5、實體讀/寫緩存

1、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並讀/寫
Java代碼  收藏代碼

    <hibernate-mapping>  
        <class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM">  
            <cache usage="read-write"/>  
        ……  
    </hibernate-mapping>   

 

2、測試代碼
Java代碼  收藏代碼

    public static void readWriteTest() {  
        SessionFactory sf =   
    new Configuration().configure().buildSessionFactory();  
              
        Session session1 = sf.openSession();  
        Transaction t1 = session1.beginTransaction();  
        //確保數據庫中有標識符爲1的FarmModel  
        FarmModel farm = (FarmModel) session1.get(FarmModel.class, 1);  
        farm.setName("as");  
        t1.commit();  
        session1.close();  
                  
        Session session2 = sf.openSession();  
        Transaction t2 = session2.beginTransaction();  
        farm = (FarmModel) session2.get(FarmModel.class, 1);  
        t2.commit();  
        session2.close();  
        sf.close();  
    }   

    §          允許更新,更新後自動同步到緩存。

    §          允許新增,新增記錄後自動同步到緩存。

    §           保證read committed隔離級別及可重複讀隔離級別(通過時間戳實現)

    §           整個過程加鎖,如果當前事務的時間戳早於二級緩存中的條目的時間戳,說明該條目已經被別的事務修改了,此時重新查詢一次數據庫,否則才使用緩存數據,因此保證可重複讀隔離級別。

 

8.4.6.2.6、實體事務緩存

需要特定緩存的支持和JTA事務支持,此處不演示。

 

8.4.6.2.7、集合緩存

此處演示讀/寫緩存示例,其他自測

1、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並讀/寫
Java代碼  收藏代碼

    <hibernate-mapping>  
        <class name="cn.javass.h3test.model.UserModel" table="TBL_USER">  
            <cache usage="read-write" />  
            <set name="farms" cascade="all" inverse="true" lazy="false">  
                <cache usage="read-write"/>  
                <key column="fk_user_id"/>  
                <one-to-many class="cn.javass.h3test.model.FarmModel"/>  
            </set>  
        </class>  
    </hibernate-mapping>  

 

2、測試代碼
Java代碼  收藏代碼

    public static void collectionReadWriteTest() {  
    SessionFactory sf =   
    new Configuration().configure().buildSessionFactory();  
              
        Session session1 = sf.openSession();  
        Transaction t1 = session1.beginTransaction();  
        //確保數據庫中有標識符爲118的UserModel  
        UserModel user = (UserModel) session1.get(UserModel.class, 118);  
        user.getFarms();  
        t1.commit();  
        session1.close();  
              
        Session session2 = sf.openSession();  
        Transaction t2 = session2.beginTransaction();  
        user = (UserModel) session2.get(UserModel.class, 118);  
        user.getFarms();  
        t2.commit();  
        session2.close();  
        sf.close();  
    }   

    §           和實體併發策略有相同含義;

    §           但集合緩存只緩存集合元素的標識符,在二級緩存中只存放相應實體的標識符,然後再通過標識符去二級緩存查找相應的實體最後組合爲集合返回。

 

 

8.4.6.2.8、查詢緩存

1、保證全局配置中有開啓了查詢緩存。

2、修改FarmModel.hbm.xml,添加如下紅色部分配置,表示實體緩存並讀/寫
Java代碼  收藏代碼

    <hibernate-mapping>  
        <class name="cn.javass.h3test.model.FarmModel" table="TBL_FARM">  
            <cache usage="read-write"/>  
        ……  
    </hibernate-mapping>   

  3、測試代碼
Java代碼  收藏代碼

    public static void queryCacheTest() {  
    SessionFactory sf =   
    new Configuration().configure().buildSessionFactory();  
           
    Session session1 = sf.openSession();  
        Transaction t1 = session1.beginTransaction();  
        Query query = session1.createQuery("from FarmModel");  
        //即使全局打開了查詢緩存,此處也是必須的  
        query.setCacheable(true);  
        List<FarmModel> farmList = query.list();  
        t1.commit();  
        session1.close();  
          
        Session session2 = sf.openSession();  
        Transaction t2 = session2.beginTransaction();  
        query = session2.createQuery("from FarmModel");  
        //即使全局打開了查詢緩存,此處也是必須的  
        query.setCacheable(true);  
        farmList = query.list();  
        t2.commit();  
        session2.close();  
            sf.close();  
    }  

      §           和實體併發策略有相同含義;

      §           和集合緩存類似,只緩存集合元素的標識符,在二級緩存中只存放相應實體的標識符,然後再通過標識符 去二級緩存查找相應的實體最後組合爲集合返回。

 

 

8.4.6.2.9、高速緩存區域

Hibernate在不同的高速緩存區域保存不同的類(實體)/集合,如果不配置區域默認都保存到“默認緩存”(defaultCache)中。

  每一個區域可以設置過期策略、緩存條目大小等等。

  對於類緩存,默認區域名是全限定類名,如cn.javass.h3test.model.UserModel。

  對於集合而言,默認區域名是全限定類名+屬性名,如cn.javass.….UserModel.farms。

  可通過hibernate.cache.region_prefix指定特定SessionFactory的區域前綴,如前綴是h3test,則如類緩存的區域名就是h3test. cn.javass.h3test.model.UserModel。如果應用程序使用多個SessionFactory 這可能是必須的。

 

    可通過<cache usage="read-write" region="區域名"/>自定義區域名,不過默認其實就可以了。

 

 

8.4.6.2.10、ehcache配置詳解:

1、默認cache:如果沒有對應的特定區域的緩存,就使用默認緩存。
Java代碼  收藏代碼

    <defaultCache  
       maxElementsInMemory="100"  
       eternal="false"  
       timeToIdleSeconds="1200"  
       timeToLiveSeconds="1200"  
       overflowToDisk="false">  
     </defaultCache>  

   2、指定區域cache:通過name指定,name對應到Hibernate中的區域名即可。
Java代碼  收藏代碼

    <cache name="cn.javass.h3test.model.UserModel"  
       maxElementsInMemory="100"  
       eternal="false"  
       timeToIdleSeconds="1200"  
       timeToLiveSeconds="1200"  
       overflowToDisk="false">  
     </cache>  

 3、cache參數詳解:

 

  name:指定區域名

  maxElementsInMemory :緩存在內存中的最大數目

  maxElementsOnDisk:緩存在磁盤上的最大數目

  eternal :緩存是否持久

  overflowToDisk : 硬盤溢出數目

  timeToIdleSeconds :當緩存條目閒置n秒後銷燬

  timeToLiveSeconds :當緩存條目存活n秒後銷燬

  memoryStoreEvictionPolicy:緩存算法,有LRU(默認)、LFU、FIFO

 

 

  4、StandardQueryCache

 

  用於查詢緩存使用,如果指定了該緩存,那麼查詢緩存將放在該緩存中。
Java代碼  收藏代碼

    <cache  
        name="org.hibernate.cache.StandardQueryCache"  
        maxElementsInMemory="5"  
        eternal="false"  
        timeToLiveSeconds="120"  
    overflowToDisk="true"/>  

 

  如果不給查詢設置區域名默認緩存到這,可以通過“query.setCacheRegion("區域名");”來設置查詢的區域名。

 

5、UpdateTimestampsCache

    時間戳緩存,內部使用,用於保存最近更新的表的時間戳,這是非常重要的,無需失效,關閉時間戳緩存區域的過期時間。
Java代碼  收藏代碼

    <cache  
        name="org.hibernate.cache.UpdateTimestampsCache"  
        maxElementsInMemory="5000"  
        eternal="true"  
        overflowToDisk="true"/>  

 

    Hibernate使用時間戳區域來決定被高速緩存的查詢結果集是否是失效的。當你重新執行了一個啓用了高速緩存的查詢時,Hibernate就在時間戳緩存中查找對被查詢的(幾張)表所做的最近插入、更新或刪除的時間戳。如果找到的時間戳晚於高速緩存查詢結果的時間戳,那麼緩存結果將被丟棄,重新執行一次查詢。

 

8.4.6.2.11、什麼時候需要查詢緩存

  大多數時候無法從結果集高速緩存獲益。必須知道:每隔多久重複執行同一查詢。

  對於那些查詢非常多但插入、刪除、更新非常少的應用程序來說,查詢緩存可提升性能。但寫入多查詢少的沒有用,總失效。

 

8.4.6.2.12、管理一級緩存

無論何時,當你給save()、update()或 saveOrUpdate()方法傳遞一個對象時,或使用load()、 get()、list()、iterate() 或scroll()方法獲得一個對象時, 該對象都將被加入到Session的內部緩存中。

當隨後flush()方法被調用時,對象的狀態會和數據庫取得同步。 如果你不希望此同步操作發生,或者你正處理大量對象、需要對有效管理內存時,你可以調用evict() 方法,從一級緩存中去掉這些對象及其集合。

ScrollableResult cats = sess.createQuery("from Cat as cat").scroll(); //a huge result set

while ( cats.next() ) {

    Cat cat = (Cat) cats.get(0);

    doSomethingWithACat(cat);

    sess.evict(cat);

}

Session還提供了一個contains()方法,用來判斷某個實例是否處於當前session的緩存中。

如若要把所有的對象從session緩存中徹底清除,則需要調用Session.clear()。

 

CacheMode參數用於控制具體的Session如何與二級緩存進行交互。

CacheMode.NORMAL - 從二級緩存中讀、寫數據。

CacheMode.GET - 從二級緩存中讀取數據,僅在數據更新時對二級緩存寫數據。

CacheMode.PUT - 僅向二級緩存寫數據,但不從二級緩存中讀數據。

CacheMode.REFRESH - 僅向二級緩存寫數據,但不從二級緩存中讀數據。通過 hibernate.cache.use_minimal_puts的設置,強制二級緩存從數據庫中讀取數據,刷新緩存內容。

 

8.4.6.2.12、管理二級緩存

對於二級緩存來說,在SessionFactory中定義了許多方法, 清除緩存中實例、整個類、集合實例或者整個集合。

sessionFactory.evict(Cat.class, catId); //evict a particular Cat

sessionFactory.evict(Cat.class);  //evict all Cats

sessionFactory.evictCollection("Cat.kittens", catId); //evict a particular collection of kittens

sessionFactory.evictCollection("Cat.kittens"); //evict all kitten collections

sessionFactory.evictQueries()//evict all queries

 

8.4.6.2.13、監控二級緩存

如若需要查看二級緩存或查詢緩存區域的內容,你可以使用統計(Statistics) API。

通過sessionFactory.getStatistics();獲取Hibernate統計信息。

此時,你必須手工打開統計選項。

hibernate.generate_statistics true

hibernate.cache.use_structured_entries true

 

具體詳見“hibernate監控.rar”(需要自己稍微改改才能用)

需要修改head.jsp中的如下代碼獲取sessionFactory
Java代碼  收藏代碼

    if(sessionFactory == null) {  
      WebApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());  
      sessionFactory = (SessionFactory)applicationContext.getBean("userSessionFactory");   
    }  

 

 

參考資料:

Robbin的《緩存技術淺談》

百度百科的高速緩存知識 http://baike.baidu.com/view/907.htm

bluedavy的《大型網站架構演化》(http://www.blogjava.net/BlueDavy/archive/2008/09/03/226749.html)

《Hibernate in Action》

 

    hibernate監控.rar (10.7 KB)
    下載次數: 448

    查看圖片附件

45

8

分享到:
評估你的代碼 | Hibernate 關係映射 總結整理

    2012-05-13 07:50
    瀏覽 27406
    評論(33)
    分類:企業架構
    相關推薦

參考知識庫

Java EE知識庫 16791  關注 | 1265  收錄

評論
33 樓 寒冰lyl 2014-09-03  
32 樓 在世界的中心呼喚愛 2014-01-26  
不是很喜歡這類文章,很多配置。。
這類文章,我也只有在項目使用到纔會去看看。。。
前面的概念很好,又複習了一遍。
31 樓 tanxiangbo 2014-01-26  
log4j:WARN No such property [maxBackupIndex] in org.apache.log4j.DailyRollingFileAppender.
Hibernate:
    select
        bo.*,
        p.code as productCode,
        p.name as productName,
        p.norm as norm ,
        (case
            when bo.channelId is not null then (select
                name
            from
                t_sel_channel c
            where
                c.id=bo.channelId)
            else ''
        end) as channelName ,
        (case
            when bo.customerId is not null then (select
                name
            from
                t_ba_customer bc
            where
                bc.id=bo.customerId)
            else ''
        end) as customerName
    from
        ( select
            b.product_id as productId ,
            sum(b.num) as borrowNum,
            sum(b.writeoffs_num) as writeoffsNum,
            sum(b.return_num) as returnNum ,
            sum(b.num)-sum(case
                when b.writeoffs_num is null then 0
                else b.writeoffs_num
            end)-sum(case
                when b.return_num is null then 0
                else b.return_num
            end) as num ,
            b.borrower_id as borrowerId,
            b.borrower_name as borrowerName,
            b.whs_id as whsId,
            b.whs_name as whsName,
            b.channel_id as channelId,
            b.customer_id as customerId
        from
            t_whs_borrow_details as b
        where
            1=1
            and b.whs_id in(
                ?, ?, ?
            )
        group by
            b.product_id,
            b.borrower_id,
            b.whs_id
        order by
            b.stamp desc )as bo
    left join
        t_sel_product p
            on p.id=bo.productId
java.lang.IllegalStateException: aliases expected length is 0; actual length is 16
張哥幫忙看看是什麼原因?
30 樓 jacking124 2014-01-14  
jinnianshilongnian 寫道
jacking124 寫道
張哥,我打開二級查詢緩存的時候,
Java代碼  收藏代碼

    Query query = session.createSQLQuery(querySQL.toString()).setFirstResult(FirstResult)  
                        .setMaxResults(MaxResults);  
                // 打開查詢緩存  
                query.setCacheable(true);  
                spList = query.list();  


的時候出現這個錯誤:
java.lang.IllegalStateException: aliases expected length is 0; actual length is 2
研究了半天,我沒有搞明白呀!

你的query貼下 是不是有問題

謝謝,張哥,問題解決的了,就是Query的問題!!
29 樓 kkrgwbj 2014-01-14  
在嗎?想請教你個問題.clob類型不能放入二級緩存中.請問有解決方法嗎?
28 樓 jinnianshilongnian 2014-01-10  
jacking124 寫道
張哥,我打開二級查詢緩存的時候,
Java代碼  收藏代碼

    Query query = session.createSQLQuery(querySQL.toString()).setFirstResult(FirstResult)  
                        .setMaxResults(MaxResults);  
                // 打開查詢緩存  
                query.setCacheable(true);  
                spList = query.list();  


的時候出現這個錯誤:
java.lang.IllegalStateException: aliases expected length is 0; actual length is 2
研究了半天,我沒有搞明白呀!

你的query貼下 是不是有問題
27 樓 jacking124 2014-01-10  
張哥,我打開二級查詢緩存的時候,
Java代碼  收藏代碼

    Query query = session.createSQLQuery(querySQL.toString()).setFirstResult(FirstResult)  
                        .setMaxResults(MaxResults);  
                // 打開查詢緩存  
                query.setCacheable(true);  
                spList = query.list();  


的時候出現這個錯誤:
java.lang.IllegalStateException: aliases expected length is 0; actual length is 2
研究了半天,我沒有搞明白呀!
26 樓 jinnianshilongnian 2013-06-07  
愛吃小雪生 寫道
樓主請問下  我按照你寫的這種方式使用二級緩存 好像是用起了,第二次list查詢不會有sql,但是不管怎麼弄 我使用 System.out.println(sf.getStatistics().getSecondLevelCacheHitCount());  查詢緩存命中次數的時候都爲0  這是什麼原因?而且數據量10w以上的時候比不用緩存還慢  謝謝  求聯繫 [email protected]

估計你沒有開啓二級緩存監控
hibernate.generate_statistics=true


可以參考
https://github.com/zhangkaitao/es/blob/master/web/src/main/resources/spring-config.xml
https://github.com/zhangkaitao/es/blob/master/web/src/main/resources/resources.properties
25 樓 愛吃小雪生 2013-06-07  
樓主請問下  我按照你寫的這種方式使用二級緩存 好像是用起了,第二次list查詢不會有sql,但是不管怎麼弄 我使用 System.out.println(sf.getStatistics().getSecondLevelCacheHitCount());  查詢緩存命中次數的時候都爲0  這是什麼原因?而且數據量10w以上的時候比不用緩存還慢  謝謝  求聯繫 [email protected]
24 樓 jinnianshilongnian 2013-01-23  
yeahwell 寫道
你好,我想請問你一下,你使用hibernate4.1.2和ehcache2.4.3配置成功了嗎?在配置文件中,hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory,這個應該使用什麼,我使用org.hibernate.cache.ehcache.EhCacheRegionFactory也不行。求指導

請參考
http://jinnianshilongnian.iteye.com/blog/1423971
23 樓 yeahwell 2013-01-22  
你好,我想請問你一下,你使用hibernate4.1.2和ehcache2.4.3配置成功了嗎?在配置文件中,hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory,這個應該使用什麼,我使用org.hibernate.cache.ehcache.EhCacheRegionFactory也不行。求指導
22 樓 xujinnan 2012-11-05  
受益匪淺!博主能不能寫篇有關延時加載的文章供大家學習一下呢?
21 樓 jinnianshilongnian 2012-07-31  
lucky16 寫道
你好,博主。
看了你的博客,覺得你應該對SSH瞭解的比較透徹,
所以想請教一下,你碰見過在SSH環境下動態添加domain的字段的情況嗎?
要求不重啓服務器,在web端添加後就可以使用的。
有什麼好點的解決方案嗎?


爲什麼要這麼做? 在人少的時候重啓不就可以了。

一般服務器都會有reload功能,一般通過重新創建classloader完成,老的classloader不會釋放,因此很容易內存溢出。

建議在人少時通過重啓解決
20 樓 lucky16 2012-07-31  
你好,博主。
看了你的博客,覺得你應該對SSH瞭解的比較透徹,
所以想請教一下,你碰見過在SSH環境下動態添加domain的字段的情況嗎?
要求不重啓服務器,在web端添加後就可以使用的。
有什麼好點的解決方案嗎?
19 樓 jinnianshilongnian 2012-05-16  
421584397 寫道
http://www.verydemo.com/demo/53/70/10571
這裏有關於hibernate聯級對象緩存文章,寫得不錯

謝謝 我也看看
18 樓 421584397 2012-05-15  
http://www.verydemo.com/demo/53/70/10571
這裏有關於hibernate聯級對象緩存文章,寫得不錯
17 樓 jeffsui 2012-05-15  
3樓,用get方式獲得的對象,對應了對象的持久化狀態。
16 樓 jinnianshilongnian 2012-05-14  
stevenjohn 寫道
stevenjohn 寫道
indexs
jinnianshilongnian 寫道
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset"  lazy="true"   >
         <key>
          <column name="questionid"></column>
         </key>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
   </set>


    <list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
         <key>
          <column name="questionid"></column>
         </key>
         <index >
         <column name="indexs"></column>
         </index>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
        </list >


那麼
  <index >
         <column name="indexs"></column>
         </index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。

stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset"  lazy="true"   >
         <key>
          <column name="questionid"></column>
         </key>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
   </set>


    <list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
         <key>
          <column name="questionid"></column>
         </key>
         <index >
         <column name="indexs"></column>
         </index>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
        </list >


那麼
  <index >
         <column name="indexs"></column>
         </index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。


你用list 會有問題的  主鍵遞增 如100的話  那麼集合就需要100個空間  浪費啊


這個indexs不是主鍵
CREATE TABLE `employee` (
  `eid` varchar(36) NOT NULL,
  `ename` varchar(50) NOT NULL,
  `did` varchar(36) NOT NULL,
  `indexs` int(11) NOT NULL,
  PRIMARY KEY (`eid`),
  KEY `FK4722E6AEFEA415DC` (`did`),
  CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk


CREATE TABLE `department` (
  `did` varchar(36) NOT NULL,
  `dname` varchar(50) NOT NULL,
  PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

只是一個普通的字段。

還有是不是不推薦使用list,在one-to-many的情況下?

  indexes不需要是索引,,,它映射到list 只是作爲索引,,list 在 index比較小而且不重複時可以用用 不過場景我沒遇到過
15 樓 stevenjohn 2012-05-14  
stevenjohn 寫道
indexs
jinnianshilongnian 寫道
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset"  lazy="true"   >
         <key>
          <column name="questionid"></column>
         </key>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
   </set>


    <list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
         <key>
          <column name="questionid"></column>
         </key>
         <index >
         <column name="indexs"></column>
         </index>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
        </list >


那麼
  <index >
         <column name="indexs"></column>
         </index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。

stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset"  lazy="true"   >
         <key>
          <column name="questionid"></column>
         </key>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
   </set>


    <list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
         <key>
          <column name="questionid"></column>
         </key>
         <index >
         <column name="indexs"></column>
         </index>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
        </list >


那麼
  <index >
         <column name="indexs"></column>
         </index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。


你用list 會有問題的  主鍵遞增 如100的話  那麼集合就需要100個空間  浪費啊


這個indexs不是主鍵
CREATE TABLE `employee` (
  `eid` varchar(36) NOT NULL,
  `ename` varchar(50) NOT NULL,
  `did` varchar(36) NOT NULL,
  `indexs` int(11) NOT NULL,
  PRIMARY KEY (`eid`),
  KEY `FK4722E6AEFEA415DC` (`did`),
  CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk


CREATE TABLE `department` (
  `did` varchar(36) NOT NULL,
  `dname` varchar(50) NOT NULL,
  PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

只是一個普通的字段。

還有是不是不推薦使用list,在one-to-many的情況下?

14 樓 stevenjohn 2012-05-14  
indexs
jinnianshilongnian 寫道
stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset"  lazy="true"   >
         <key>
          <column name="questionid"></column>
         </key>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
   </set>


    <list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
         <key>
          <column name="questionid"></column>
         </key>
         <index >
         <column name="indexs"></column>
         </index>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
        </list >


那麼
  <index >
         <column name="indexs"></column>
         </index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。

stevenjohn 寫道
問個問題,如果hibernate的one-to-many,裏面如果用list不用set的話。那麼
<set name="answerset"  lazy="true"   >
         <key>
          <column name="questionid"></column>
         </key>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
   </set>


    <list name="answerlibraries" inverse="false" lazy="true" cascade="all" >
         <key>
          <column name="questionid"></column>
         </key>
         <index >
         <column name="indexs"></column>
         </index>
          <one-to-many class="com.itcso.crm.pojo.Answerlibrary" />
        </list >


那麼
  <index >
         <column name="indexs"></column>
         </index>
indexs這個字段在數據庫裏面是怎麼設置的,這個如果用mysql的話,不能自動增長,怎麼處理一下,這個字段呢?我看網上有人根本沒在映射文件hbm.xml裏面配置這個字段。


你用list 會有問題的  主鍵遞增 如100的話  那麼集合就需要100個空間  浪費啊


這個indexs不是主鍵
CREATE TABLE `employee` (
  `eid` varchar(36) NOT NULL,
  `ename` varchar(50) NOT NULL,
  `did` varchar(36) NOT NULL,
  `idx` int(11) NOT NULL,
  PRIMARY KEY (`eid`),
  KEY `FK4722E6AEFEA415DC` (`did`),
  CONSTRAINT `FK4722E6AEFEA415DC` FOREIGN KEY (`did`) REFERENCES `department` (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk


CREATE TABLE `department` (
  `did` varchar(36) NOT NULL,
  `dname` varchar(50) NOT NULL,
  PRIMARY KEY (`did`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk

只是一個普通的字段。

還有是不是不推薦使用list,在one-to-many的情況下?
發佈了9 篇原創文章 · 獲贊 153 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章