hibernate可以用兩種不同的對(duì)象緩存:first-level cache 和 second-level cache。first-level cache和Session對(duì)象關(guān)聯(lián),而second-level cache是和Session Factory對(duì)象關(guān)聯(lián)。

        缺省地,hibernate已經(jīng)使用基于每個(gè)事務(wù)的first-level cache Hibernatefirst-level cache主要是減少在一個(gè)事務(wù)內(nèi)的sql查詢數(shù)量。例如,如果一個(gè)對(duì)象在同一個(gè)事務(wù)內(nèi)被修改多次,hibernate將只生成一個(gè)包括所有修改的 UPDATE SQL語(yǔ)句。為了減少數(shù)據(jù)流動(dòng),second-level cacheSession Factory級(jí)的不同事務(wù)之間保持load的對(duì)象,這些對(duì)象對(duì)整個(gè)應(yīng)用可用,不只是對(duì)當(dāng)前用戶正在運(yùn)行的查詢。這樣,每次查詢將返回已經(jīng)load在緩存里的對(duì)象,避免一個(gè)或更多潛在的數(shù)據(jù)庫(kù)事務(wù)。

下載ehcache,hibernate3.2必須要ehcache1.2以上才能支持。可以修改log4j配置文件log4j.logger.net.sf.hibernate.cache=debug查看日志

1.在類路徑上ehcache.xml

<ehcache>    
     <diskStore path="java.io.tmpdir"/>
      <defaultCache
         maxElementsInMemory="10000"
         eternal="false"
         overflowToDisk="true"
         timeToIdleSeconds="120"
         timeToLiveSeconds="120"
         diskPersistent="false"
         diskExpiryThreadIntervalSeconds="120"/>       
   
</ehcache>

2.applicationContext-hibernate.xmlHibernate SessionFactory配置:

           <property name="hibernateProperties">
             <props>
                 <prop key="hibernate.dialect">@HIBERNATE-DIALECT@</prop>
                 <!--<prop key="hibernate.show_sql">true</prop>-->
                 <prop key="hibernate.max_fetch_depth">3</prop>
                 <prop key="hibernate.hibernate.use_outer_join">true</prop>
                 <prop key="hibernate.jdbc.batch_size">10</prop>
                 <prop key="hibernate.cache.use_query_cache">true</prop>
                 <prop         key="hibernate.cache.use_second_level_cache">true</prop>
                 <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>                

             </props>
        
          </bean>
說(shuō)明:如果不設(shè)置查詢緩存,那么hibernate只會(huì)緩存使用load()方法獲得的單個(gè)持久化對(duì)象,如果想緩存使用findall() list()Iterator()createCriteria()createQuery()等方法獲得的數(shù)據(jù)結(jié)果集的話,就需要設(shè)置 hibernate.cache.use_query_cache true 才行

.對(duì)于"query cache",需要在程序里編碼:

         getHibernateTemplate().setCacheQueries(true);
         return getHibernateTemplate().find(hql);



------君臨天下,舍我其誰(shuí)------