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。 Hibernate用first-level cache主要是減少在一個事務(wù)內(nèi)的sql查詢數(shù)量。例如,如果一個對象在同一個事務(wù)內(nèi)被修改多次,hibernate將只生成一個包括所有修改的 UPDATE SQL語句。為了減少數(shù)據(jù)流動,second-level cache在Session 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.xml里Hibernate 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);
------君臨天下,舍我其誰------