天天看點

Spring使用記憶體資料庫三

首先,配置更新:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

<code>public</code> <code>Map&lt;String, Object&gt; jpaProperties() {</code>

<code>        </code><code>Map&lt;String, Object&gt; props = </code><code>new</code> <code>HashMap&lt;String, Object&gt;();</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>&lt;?</code><code>xml</code> <code>version</code><code>=</code><code>"1.0"</code> <code>encoding</code><code>=</code><code>"UTF-8"</code><code>?&gt;</code>

<code>&lt;</code><code>ehcache</code><code>&gt;</code>

<code>    </code><code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;/</code><code>defaultCache</code><code>&gt;</code>

<code>    </code><code>&lt;!-- 單獨對某個entity的緩存政策設定 --&gt;</code>

<code>    </code><code>&lt;</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>&gt;</code>

<code>    </code><code>&lt;/</code><code>cache</code><code>&gt;</code>

<code>                          </code> 

<code>    </code><code>&lt;</code><code>cache</code> <code>name</code><code>=</code><code>"items"</code>

<code>&lt;/</code><code>ehcache</code><code>&gt;</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&lt;</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,如需轉載請自行聯系原作者