天天看點

Hibernate的緩存

持久層緩存的級别

  • 事務級别的緩存
  • 應用(程序)級别的緩存
  • 分布式級别的緩存

Hibernate的一級緩存

Hibernate中的緩存分成兩級:一級緩存和二級緩存

Hibernate的一級緩存是内置的緩存,不能通過程式代碼或者配置進行人為的取消,同時一級

緩存通過Session對象實作緩存,是以一級緩存也稱為Session緩存

一級緩存的管理

使用evict()方法從緩存中移除緩存對象

使用clear()方法從緩存中清除所有對象

使用Session對象contains()判斷是否在緩存中(true/false)、flush()和setReadOnly()方法

Hibernate的二級緩存

Hibernate的二級緩存由SessionFactory對象負責管理,是應用級别的緩存,可以緩存整個應

用的持久化對象

Hibernate的二級緩存又稱SessionFactory緩存

Hibernate的二級緩存

緩存名稱                   緩存類型                                對應的擴充卡類

Hashtable                 記憶體                                    org.hibernate.cache.HashtableCacheProvider

EHCache               記憶體,硬碟                               org.hibernate.cache.EhCacheProvider

OSCache               記憶體,硬碟                              org.hibernate.cache.OSCacheProvider

SwarmCahe     分布式(不支援分布式事務)               org.hibernate.cache.SwarmCacheProvider

JBoss Cache1.x 分布式(支援分布式事務)                 org.hibernate.cache.TreeCacheProvider

JBoss Cache2. 分布式(支援分布式事務)                   org.hibernate.cache.jbc2.JBossCacheRegionFactory

EHCache作為二級緩存

應用EHCache作為二級緩存

<hibernate-configuration>
	<session-factory>
		<property name="cache.provider_class">
			org.hibernate.cache.EhCacheProvider
		</property>
	</session-factory>
</hibernate-configuration>      

編寫ehcache.xml

<ehcache>
	<diskStore path="java.io.tmpdir" />
	<defaultCache maxElementsInMemory="10000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true" />
		
	<cache name="com.rbh.examples.Product" maxElementsInMemory="2000" eternal="true"
		timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" />
</ehcache>      

 maxElementsInMemory 設定儲存在記憶體中的緩存對象的最大數量

eternal 設定緩存中對象是否永遠不過期,如果值為true,超過設定被忽略,緩存對象永不過期

timeToIdleSeconds 設定緩存中對象在它過期之前的最大空閑時間,機關為秒

timeToLiveSeconds 設定緩存中對象在它過期之前的最大生存時間,機關為秒

overflowToDisk 設定記憶體中的緩存對象達到maxElementsInMemory限制時,是否将緩存對象儲存到硬碟中

二級緩存的政策

隻讀緩存(read-only)

讀/寫緩存(read-write)

不嚴格的讀/寫緩存(nonstrict-read-write)

事務緩存(transactional)

緩存元件對緩存政策的支援

Hibernate的緩存

在對應的持久化類中設定使用緩存的政策

添加

<cache usage="read-write" />      

 list讀取資料,讀的資料可以幫助增加二級緩存,不會讀取緩存中的資料.

iterator會查詢二級緩存資料,如果讀的資料不在二級緩存 n+1次查詢記錄

二級緩存 緩存集合對象

demo

ehcache.xml

<ehcache>
	<cache name="com.rbh.examples.Category" maxElementsInMemory="2000" eternal="true"
		timeToIdleSeconds="0" timeToLiveSeconds="0" overflowToDisk="false" />
	 
	<cache name="com.rbh.examples.Category.products" maxElementsInMemory="1000" eternal="true"
		timeToIdleSeconds="300" timeToLiveSeconds="600" overflowToDisk="false" />
</ehcache>      

 Category.hbm.xml

<hibernate-mapping>
	<class name="com.rbh.examples.Category" table="CATEGORY">
	 <cache usage="read-write" />
	<set name="products" cascade="save-update" inverse="true">
		    <cache usage="read-write" />
			<key column="category_id"></key>
			<one-to-many class="com.rbh.examples.Product" />
		</set>
		</class>
</hibernate-mapping>      

二級緩存的管理

SessionFactory sessionFactory=HibernateSessionFactoryUtil.getSessionFactory();

sessionFactory.evict(Category.class);

把二級緩存的Category的對象全部清除

SessionFactory sessionFactory=HibernateSessionFactoryUtil.getSessionFactory();

sessionFactory.evictCollection("com.rbh.examples.Category.products");

把Category對象的下的products集合所緩存的對象清除

SessionFactory sessionFactory=HibernateSessionFactoryUtil.getSessionFactory();

sessionFactory.evictEntity("com.rbh.examples.Category");

把Category對應的所有持久化對象的二級緩存都清除

SessionFactory sessionFactory=HibernateSessionFactoryUtil.getSessionFactory();

sessionFactory.evictEntity("com.rbh.examples.Category",new Integer(1));

把指定的持久化對象二級緩存清除

查詢緩存(Query Cache)

<hibernate-configuration>
	<session-factory>
		<property name="cache.provider_class">
			org.hibernate.cache.EhCacheProvider
		</property>
		<property name="hibernate.cache.use_query_cache">true</property>
	</session-factory>
</hibernate-configuration>      
Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Category");
query.setCacheable(true);
List<Category> list = query.list();
           

memcached作為二級緩存

memcached是一款知名的,高性能的,分布式的記憶體對象緩存系統,主要用于在web應用中降低資料庫的負載,它通過緩存資料庫的查詢結果,減少對資料庫的通路次數,用以提高web應用的通路速度

Hibernate-memcached

Hibernate-memcached是CacheProvider接口的memcached實作

需要用到 memcached-2.x.jar,spy-2.4.jar,commons-codec-1.x.jar,hibernate-memcached-1.2.2.jar

使用memcached windows的伺服器

添加Hibernate.hbm.xml

<property name="cache.provider_class">
	com.googlecode.hibernate.memcached.MemcachedCacheProvider 
</property>      

繼續閱讀