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

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

下載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>
說明:如果不設置查詢緩存,那么hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall() list()Iterator()createCriteria()createQuery()等方法獲得的數據結果集的話,就需要設置 hibernate.cache.use_query_cache true 才行

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

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



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