二級緩存配置(spring+hibernate)
說明:本人不建議使用查詢緩存,因為查詢緩存要求完全相同的查詢sql語句才會起作用,所說的查詢緩存是針對第二次查詢時 sql語句與第一次sql語句完全相同 那麼就可以從緩存中取資料而不去資料庫中取資料了,在不啟用查詢緩存的情況下 每次的查詢資料也會緩存到二級緩存的 隻不過每次查詢都會去查詢資料庫(不包括根據ID查詢),啟用查詢緩存很麻煩 需要每次查詢時 調用Query.setCacheable(true)方法才可以,如:List<OrgiData> orgiDatas = (List<OrgiData>) s.createQuery("from OrgiData").setCacheable(true).list();
是以建議将查詢緩存設定為如下:
hibernate.cache.use_query_cache=false
還有就是最重要的一點:對于經常修改或重要的資料不宜進行緩存,因為多并發時會造成資料不同步的情況。
首先增加ehcache-1.4.1.jar和backport-util-concurrent-3.1.jar或oscache-2.1.jar
一、spring配置
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="mappingResources">
<list>
<value>com/handpay/core/merchant/bean/MerchGroupBuy.hbm.xml
</value>
</list>
</property>
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.SQLServerDialect
hibernate.show_sql=true
hibernate.format_sql=true
hibernate.hbm2ddl.auto=update
[color=red] hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=false
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider[/color] </value>
</property>
</bean>
<!---紅色字型是二級緩存相關的設定->
二、hbm.xml檔案示例
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.handpay.core.merchant.bean">
<class name="MerchGroupBuy" table="merch_group_buy">
<cache usage="read-write" region="com.handpay.core.merchant.bean.MerchGroupBuy"/>
<id name="id">
<generator class="native" />
</id>
<property name="code" />
<property name="createTime"/>
<property name="minNum"/>
<property name="status">
</property>
<property name="title"/>
<property name="typeCode"/>
<property name="updateTime"/>
</class>
</hibernate-mapping>
三、注解示例
@Entity
[color=red]@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) [/color]
@Table(name = "alcor_t_countries", catalog = "alcorweb")
public class AlcorTCountries implements java.io.Serializable{。。。。}
四、配置檔案參數詳解
ehcache.xml是ehcache的配置檔案,并且存放在應用的classpath中。下面是對該XML檔案中的一些元素及其屬性的相關說明:
<diskStore>元素:指定一個檔案目錄,當EHCache把資料寫到硬碟上時,将把資料寫到這個檔案目錄下。 下面的參數這樣解釋:
user.home – 使用者主目錄
user.dir – 使用者目前工作目錄
java.io.tmpdir – 預設臨時檔案路徑
<defaultCache>元素:設定緩存的預設資料過期政策。
<cache>元素:設定具體的命名緩存的資料過期政策。
<cache>元素的屬性
name:緩存名稱。通常為緩存對象的類名(非嚴格标準)。
maxElementsInMemory:設定基于記憶體的緩存可存放對象的最大數目。
maxElementsOnDisk:設定基于硬碟的緩存可存放對象的最大數目。
eternal:如果為true,表示對象永遠不會過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,預設為false;
timeToIdleSeconds: 設定允許對象處于空閑狀态的最長時間,以秒為機關。當對象自從最近一次被通路後,如果處于空閑狀态的時間超過了timeToIdleSeconds屬性值,這個對象就會過期。當對象過期,EHCache将把它從緩存中清空。隻有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地處于空閑狀态。
timeToLiveSeconds:設定對象允許存在于緩存中的最長時間,以秒為機關。當對象自從被存放到緩存中後,如果處于緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過期。當對象過期,EHCache将把它從緩存中清除。隻有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示對象可以無限期地存在于緩存中。timeToLiveSeconds必須大于timeToIdleSeconds屬性,才有意義。
overflowToDisk:如果為true,表示當基于記憶體的緩存中的對象數目達到了maxElementsInMemory界限後,會把益出的對象寫到基于硬碟的緩存中。注意:如果緩存的對象要寫入到硬碟中的話,則該對象必須實作了Serializable接口才行。
memoryStoreEvictionPolicy:緩存對象清除政策。有三種:
1 FIFO ,first in first out ,這個是大家最熟的,先進先出,不多講了
2 LFU , Less Frequently Used ,就是上面例子中使用的政策,直白一點就是講一直以來最少被使用的。如上面所講,緩存的元素有一個hit 屬性,hit 值最小的将會被清出緩存。
2 LRU ,Least Recently Used ,最近最少使用的,緩存的元素有一個時間戳,當緩存容量滿了,而又需要騰出地方來緩存新的元素的時候,那麼現有緩存元素中時間戳離目前時間最遠的元素将被清出緩存。
五 、檢視 二級緩存資料
1、使用sessionFactory直接擷取
Map cacheEntries = sessionFactory().getStatistics()
.getSecondLevelCacheStatistics("cacheRegionName")
.getEntries();
其中 cacheRegionName 既是 ehcache.xml配置中的<cache 标簽的name屬性值
2、讓log4j列印緩存資訊(生成環境下請注釋掉,以免影響性能)
log4j.logger.org.hibernate.cache=debug
[color=red]
附件是:最新研究過結果及完整的ehcache.xml配置,請參考!!![/color]