首先,配置更新:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<code>public</code> <code>Map<String, Object> jpaProperties() {</code>
<code> </code><code>Map<String, Object> props = </code><code>new</code> <code>HashMap<String, Object>();</code>
<code> </code><code>//Hibernate JPA properties</code>
<code> </code>
<code> </code><code>props.put(</code><code>"hibernate.dialect"</code><code>, H2Dialect.</code><code>class</code><code>.getName());</code>
<code> </code><code>//以下兩行訓示使用二級緩存</code>
<code> </code><code>props.put(</code><code>"hibernate.cache.use_second_level_cache"</code><code>, </code><code>"true"</code><code>);</code>
<code> </code><code>props.put(</code><code>"hibernate.cache.use_query_cache"</code><code>, </code><code>"true"</code><code>);</code>
<code> </code><code>//顯示統計資料,這樣我們通過輸出結果就可以知道緩存命中情況等</code>
<code> </code><code>props.put(</code><code>"hibernate.generate_statistics"</code><code>, </code><code>"true"</code><code>);</code>
<code> </code><code>//本文使用Hibernate4,對于以前的版本可以使用如***釋代碼</code>
<code> </code><code>//props.put("hibernate.cache.provider_class", org.hibernate.cache.EhCacheProvider.class.getName());</code>
<code> </code><code>props.put(</code><code>"hibernate.cache.region.factory_class"</code><code>, EhCacheRegionFactory.</code><code>class</code><code>.getName()); </code>
<code> </code><code>return</code> <code>props;</code>
<code> </code><code>}</code>
其次,在實體類Order和Item中增加緩存标注:
<code>@Entity</code>
<code>@Cacheable</code>
<code>@Cache</code><code>(region=</code><code>"orders"</code><code>, usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)</code>
<code>@Table</code><code>(name=</code><code>"T_ORDER"</code><code>)</code>
<code>public</code> <code>class</code> <code>Order {</code>
<code>//---------------------------------------------</code>
<code>@Cache</code><code>(region=</code><code>"items"</code><code>, usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)</code>
<code>public</code> <code>class</code> <code>Item {</code>
然後,增加ehcache配置檔案ehcache.xml
17
<code><?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?></code>
<code><</code><code>ehcache</code><code>></code>
<code> </code><code><</code><code>defaultCache</code> <code>maxElementsInMemory</code><code>=</code><code>"10000"</code> <code>eternal</code><code>=</code><code>"false"</code>
<code> </code><code>timeToIdleSeconds</code><code>=</code><code>"86400"</code> <code>timeToLiveSeconds</code><code>=</code><code>"86400"</code> <code>overflowToDisk</code><code>=</code><code>"false"</code>
<code> </code><code>clearOnFlush</code><code>=</code><code>"true"</code> <code>statistics</code><code>=</code><code>"false"</code> <code>memoryStoreEvictionPolicy</code><code>=</code><code>"LRU"</code> <code>></code>
<code> </code><code></</code><code>defaultCache</code><code>></code>
<code> </code><code><!-- 單獨對某個entity的緩存政策設定 --></code>
<code> </code><code><</code><code>cache</code> <code>name</code><code>=</code><code>"orders"</code>
<code> </code><code>maxElementsInMemory</code><code>=</code><code>"10000"</code> <code>eternal</code><code>=</code><code>"false"</code> <code>timeToIdleSeconds</code><code>=</code><code>"86400"</code>
<code> </code><code>timeToLiveSeconds</code><code>=</code><code>"86400"</code> <code>memoryStoreEvictionPolicy</code><code>=</code><code>"LFU"</code> <code>transactionalMode</code><code>=</code><code>"off"</code><code>></code>
<code> </code><code></</code><code>cache</code><code>></code>
<code> </code>
<code> </code><code><</code><code>cache</code> <code>name</code><code>=</code><code>"items"</code>
<code></</code><code>ehcache</code><code>></code>
最後,修改單元測試用例和Maven依賴:
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<code>public</code> <code>void</code> <code>testSaveAndFind() </code><code>throws</code> <code>Exception {</code>
<code> </code><code>for</code><code>(</code><code>int</code> <code>i=</code><code>0</code><code>; i<</code><code>1000</code><code>; i++){</code>
<code> </code><code>Order order = </code><code>new</code> <code>Order();</code>
<code> </code><code>Item item = </code><code>new</code> <code>Item();</code>
<code> </code><code>item.setProduct(</code><code>"foo"</code><code>+i);</code>
<code> </code><code>order.getItems().add(item);</code>
<code> </code><code>entityManager.persist(order);</code>
<code> </code><code>}</code>
<code> </code>
<code> </code><code>entityManager.flush();</code>
<code> </code><code>// Otherwise the query returns the existing order (and we didn't set the</code>
<code> </code><code>// parent in the item)...</code>
<code> </code><code>entityManager.clear();</code>
<code> </code><code>Query query2 = entityManager</code>
<code> </code><code>.createQuery(</code>
<code> </code><code>"select o from Order o join o.items i "</code><code>);</code>
<code> </code><code>//query2.setHint("org.hibernate.cacheable", true);</code>
<code> </code><code>if</code><code>(query2 </code><code>instanceof</code> <code>QueryImpl){</code>
<code> </code><code>((QueryImpl)query2).getHibernateQuery().setCacheable(</code><code>true</code><code>);</code>
<code> </code><code>assertEquals(</code><code>1000</code><code>, query2.getResultList().size());</code>
<code> </code><code>query2.getResultList();</code>
<code> </code><code>Query query = entityManager</code>
<code> </code><code>"select o from Order o join o.items i where i.product=:product"</code><code>)</code>
<code> </code><code>.setParameter(</code><code>"product"</code><code>, </code><code>"foo9"</code><code>);</code>
<code> </code><code>query.setHint(</code><code>"org.hibernate.cacheable"</code><code>, </code><code>true</code><code>);</code>
<code> </code><code>Order other = (Order) query.getSingleResult();</code>
<code> </code><code>Order other2 = (Order) query.getSingleResult();</code>
<code> </code><code>assertEquals(</code><code>1</code><code>, other2.getItems().size());</code>
<code> </code><code>assertEquals(other, other2.getItems().iterator().next().getOrder()); </code>
ok,大功告成,可以運作測試用例,然後通過日志檢視緩存命中率,也可以修改代碼
<a href="http://down.51cto.com/data/2363915" target="_blank">附件:http://down.51cto.com/data/2363915</a>
本文轉自sarchitect 51CTO部落格,原文連結:http://blog.51cto.com/stevex/1344157,如需轉載請自行聯系原作者