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。 Hibernate用first-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 cache在Session 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.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>
說(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í)
------