持久層緩存的級别
- 事務級别的緩存
- 應用(程序)級别的緩存
- 分布式級别的緩存
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)
緩存元件對緩存政策的支援
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicGcq5iN5E2N1YmMkRGMjFWL5YjYh1SZ4czMtkTMmJWLldTNllzMiV2LcNzMxAjNvw1YpB3LcVmc1R3YpB3LcRWYvxGc19CXt92YuUWelRXauwGZvw1LcpDc0RHaiojIsJye.jpg)
在對應的持久化類中設定使用緩存的政策
添加
<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>