歡迎您光臨本站 註冊首頁

Hibernate中二級緩存的配置和使用

←手機掃碼閱讀     火星人 @ 2014-03-10 , reply:0

(一)Hibernate的二級緩存策略的一般過程如下:

1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的數據對象.

2) 把獲得的所有數據對象根據ID放入到第二級緩存中.

3) 當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那麼從二級緩存中查;查不到,再查詢資料庫,把結果按照ID放入到緩存.

4) 刪除、更新、增加數據的時候,同時更新緩存.

Hibernate的二級緩存策略,是針對於ID查詢的緩存策略,對於條件查詢則毫無作用.為此,Hibernate提供了針對條件查詢的Query Cache.

(二)什麼樣的數據適合存放到第二級緩存中?

1 很少被修改的數據

2 不是很重要的數據,允許出現偶爾併發的數據

3 不會被併發訪問的數據

4 參考數據,指的是供應用參考的常量數據,它的實例數目有限,它的實例會被許多其他類的實例引用,實例極少或者從來不會被修改.

(三)不適合存放到第二級緩存的數據?

1 經常被修改的數據

2 財務數據,絕對不允許出現併發

3 與其他應用共享的數據.

實踐部分:

使用EhCache配置二級緩存:

配置準備:

1)把ehcache-1.2.3.jar加入到當前應用的classpath中.

2)在hibernate.cfg.xml文件中加入EhCache緩存插件的提供類.

  1. <!--配置緩存插件 -->
  2. <property name="hibernate.cache.provider_class">
  3. org.hibernate.cache.EhCacheProvider
  4. </property>

3)挎貝ehcache.xml文件到類路徑(項目工程的src目錄下),這個文件在Hibernate安裝目錄的etc下.

配置步驟:

Hibernate允許在類和集合的粒度上設置第二級緩存.在映射文件中,<class>和<set>元素都有一個<cache>子元素,這個子元素用來配置二級緩存.
示例:以category(產品類別)和product(產品)的映射為例:

1) 修改要配置緩存的那個持久化類的對象關係映射文件:

Category.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.Category" table="categories">
<!—
配置緩存,必須緊跟在class元素後面
對緩存中的Category對象採用讀寫型的併發訪問策略
-->
<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">
<!-- Hibernate只會緩存對象的簡單屬性的值,
要緩存集合屬性,必須在集合元素中也加入<cache>子元素
而Hibernate僅僅是把與當前持久對象關聯的對象的OID存放到緩存中.
如果希望把整個關聯的對象的所有數據都存入緩存,
則要在相應關聯的對象的映射文件中配置<cache>元素
-->
<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>

2)編輯ehcache.xml文件:

<ehcache>
<diskStore path="c:\ehcache"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
/>

<!-- 設置Category類的緩存的數據過期策略 -->
<cache name="org.qiujy.domain.cachedemo.Category"
maxElementsInMemory="100"
eternal="true"
timeToIdleSeconds="0"
timeToLiveSeconds="0"
overflowToDisk="false"
/>

<!-- 設置Category類的products集合的緩存的數據過期策略 -->
<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表設置cache策略 xml 代碼 3.在DAO中,調用find方法查詢之前,設置使用緩存 Java代碼 getHibernateTemplate().setCacheQueries(true); 補充: 如果不設置「查詢緩存」,那麼hibernate只會緩存使用load()方法獲得的單個持久化對象,如果想緩存使用findall()、list()、Iterator()、createCriteria()、createQuery()等方法獲得的數據結果集的話,就需要設置 hibernate.cache.use_query_cache true 才行.


[火星人 ] Hibernate中二級緩存的配置和使用已經有755次圍觀

http://coctec.com/docs/java/show-post-61482.html