配置Hibernate二級(jí)緩存剖析
Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹配置Hibernate二級(jí)緩存,包括介紹在Spring托管的Hibernate二級(jí)緩存等方面。
使用EhCache配置Hibernate二級(jí)緩存:
配置Hibernatee二級(jí)緩存準(zhǔn)備:
1)把ehcache-1.2.3.jar加入到當(dāng)前應(yīng)用的classpath中。
2)在hibernate.cfg.xml文件中加入EhCache緩存插件的提供類(lèi)。
- <property name="hibernate.cache.provider_class">
 - org.hibernate.cache.EhCacheProvider
 - </property>
 
3)挎貝ehcache.xml文件到類(lèi)路徑(項(xiàng)目工程的src目錄下),這個(gè)文件在Hibernate安裝目錄的etc下。
- <?xml version="1.0" encoding="utf-8"?>
 - <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 - "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 - <hibernate-mapping>
 - <class name="org.qiujy.domain.cachedemo.Category" table="categories">
 - //配置緩存,必須緊跟在class元素后面對(duì)緩存中的Category對(duì)象采用讀寫(xiě)型的并發(fā)訪問(wèn)策略
 - <cache usage="read-write"/>
 - <id name="id" type="java.lang.Long">
 - <column name="id" />
 - <generator class="native" />
 - </id>
 - <!-- 配置版本號(hào),必須緊跟在id元素后面 -->
 - <version name="version" column="version" type="java.lang.Long" />
 - <property name="name" type="java.lang.String">
 - <column name="name" length="32" not-null="true"/>
 - </property>
 - <property name="description" type="java.lang.String">
 - <column name="description" length="255"/>
 - </property>
 - <set name="products" table="products" cascade="all" inverse="true">
 - <cache usage="read-write"/>
 - <key column="categoryId" not-null="true"/>
 - <one-to-many class="org.qiujy.domain.cachedemo.Product"/>
 - </set>
 - </class>
 - </hibernate-mapping>
 
Product.hbm.xml
- <?xml version="1.0" encoding="utf-8"?>
 - <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
 - "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
 - <hibernate-mapping>
 - <class name="org.qiujy.domain.cachedemo.Product" table="products">
 - <cache usage="read-write"/>
 - <id name="id" type="java.lang.Long">
 - <column name="id" />
 - <generator class="native" />
 - </id>
 - <!-- 配置版本號(hào),必須緊跟在id元素后面 -->
 - <version name="version" column="version" type="java.lang.Long" />
 - <property name="name" type="java.lang.String">
 - <column name="name" length="32" not-null="true"/>
 - </property>
 - <property name="description" type="java.lang.String">
 - <column name="description" length="255"/>
 - </property>
 - <property name="unitCost" type="java.lang.Double">
 - <column name="unitCost" />
 - </property>
 - <property name="pubTime" type="java.util.Date">
 - <column name="pubTime" not-null="true" />
 - </property>
 - <many-to-one name="category"
 - column="categoryId"
 - class="org.qiujy.domain.cachedemo.Category"
 - cascade="save-update"
 - not-null="true">
 - </many-to-one>
 - </class>
 - </hibernate-mapping>
 
編輯ehcache.xml文件:
- <ehcache>
 - <diskStore path="c:\\ehcache\"/>
 - <defaultCache
 - maxElementsInMemory="10000"
 - eternal="false"
 - timeToIdleSeconds="120"
 - timeToLiveSeconds="120"
 - overflowToDisk="true"
 - />
 - <!-- 設(shè)置Category類(lèi)的緩存的數(shù)據(jù)過(guò)期策略 -->
 - <cache name="org.qiujy.domain.cachedemo.Category"
 - maxElementsInMemory="100"
 - eternal="true"
 - timeToIdleSeconds="0"
 - timeToLiveSeconds="0"
 - overflowToDisk="false"
 - />
 - <!-- 設(shè)置Category類(lèi)的products集合的緩存的數(shù)據(jù)過(guò)期策略 -->
 - <cache name="org.qiujy.domain.cachedemo.Category.products"
 - maxElementsInMemory="500"
 - eternal="false"
 - timeToIdleSeconds="300"
 - timeToLiveSeconds="600"
 - overflowToDisk="true"
 - />
 - <cache name="org.qiujy.domain.cachedemo.Product"
 - maxElementsInMemory="500"
 - eternal="false"
 - timeToIdleSeconds="300"
 - timeToLiveSeconds="600"
 - overflowToDisk="true"
 - />
 - </ehcache>
 
在Spring托管的Hibernate二級(jí)緩存
1.在spring的配置文件中,hibernate部分加入 xml 代碼 org.hibernate.cache.EhCacheProvider true 
2.為HBM表設(shè)置cache策略 xml 代碼 
3.在DAO中,調(diào)用find方法查詢(xún)之前,設(shè)置使用緩存 Java代碼 getHibernateTemplate().setCacheQueries(true); 
補(bǔ)充: 如果不設(shè)置“查詢(xún)緩存”,那么Hibernate只會(huì)緩存使用load()方法獲得的單個(gè)持久化對(duì)象,如果想緩存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的數(shù)據(jù)結(jié)果集的話(huà),就需要設(shè)置 hibernate.cache.use_query_cache true 才行。
【編輯推薦】















 
 
 





 
 
 
 