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

        缺省地,hibernate已經(jīng)使用基于每個事務(wù)的first-level cache Hibernatefirst-level cache主要是減少在一個事務(wù)內(nèi)的sql查詢數(shù)量。例如,如果一個對象在同一個事務(wù)內(nèi)被修改多次,hibernate將只生成一個包括所有修改的 UPDATE SQL語句。為了減少數(shù)據(jù)流動,second-level cacheSession Factory級的不同事務(wù)之間保持load的對象,這些對象對整個應(yīng)用可用,不只是對當(dāng)前用戶正在運行的查詢。這樣,每次查詢將返回已經(jīng)load在緩存里的對象,避免一個或更多潛在的數(shù)據(jù)庫事務(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>
說明:如果不設(shè)置查詢緩存,那么hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall() list()Iterator()createCriteria()createQuery()等方法獲得的數(shù)據(jù)結(jié)果集的話,就需要設(shè)置 hibernate.cache.use_query_cache true 才行

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

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



------君臨天下,舍我其誰------