天天看點

hibernate二級緩存(包括注解方式)

二級緩存配置(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]