配置Hibernate二級緩存剖析
Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹配置Hibernate二級緩存,包括介紹在Spring托管的Hibernate二級緩存等方面。
使用EhCache配置Hibernate二級緩存:
配置Hibernatee二級緩存準(zhǔn)備:
1)把ehcache-1.2.3.jar加入到當(dāng)前應(yīng)用的classpath中。
2)在hibernate.cfg.xml文件中加入EhCache緩存插件的提供類。
- <property name="hibernate.cache.provider_class">
- org.hibernate.cache.EhCacheProvider
- </property>
3)挎貝ehcache.xml文件到類路徑(項目工程的src目錄下),這個文件在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元素后面對緩存中的Category對象采用讀寫型的并發(fā)訪問策略
- <cache usage="read-write"/>
- <id name="id" type="java.lang.Long">
- <column name="id" />
- <generator class="native" />
- </id>
- <!-- 配置版本號,必須緊跟在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>
- <!-- 配置版本號,必須緊跟在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類的緩存的數(shù)據(jù)過期策略 -->
- <cache name="org.qiujy.domain.cachedemo.Category"
- maxElementsInMemory="100"
- eternal="true"
- timeToIdleSeconds="0"
- timeToLiveSeconds="0"
- overflowToDisk="false"
- />
- <!-- 設(shè)置Category類的products集合的緩存的數(shù)據(jù)過期策略 -->
- <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二級緩存
1.在spring的配置文件中,hibernate部分加入 xml 代碼 org.hibernate.cache.EhCacheProvider true
2.為HBM表設(shè)置cache策略 xml 代碼
3.在DAO中,調(diào)用find方法查詢之前,設(shè)置使用緩存 Java代碼 getHibernateTemplate().setCacheQueries(true);
補充: 如果不設(shè)置“查詢緩存”,那么Hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的數(shù)據(jù)結(jié)果集的話,就需要設(shè)置 hibernate.cache.use_query_cache true 才行。
【編輯推薦】