前幾篇文章已經搭建了一個基本的springmvc demo,現在我們來完善下。
相信大家寫程序的時候都接觸過緩存的概念,也都知道,數據量大的時候緩存對於提高效率是很顯著的。而緩存一般包括前台靜態資源緩存和后台查詢出來的數據緩存,這里介紹的是后者。最后感謝以下兩篇文章,本文是在他們的基礎上完成這個demo的。
http://my.oschina.net/duoduo3369/blog/173924
http://blog.csdn.net/jadyer/article/details/12257865
開始奉上代碼。
1.在springmvc的配置文件中加入緩存配置,代碼如下:
- <!-- 緩存配置(兩種) -->
- <!-- 啟用緩存注解功能(請將其配置在Spring主配置文件中) -->
- <cache:annotation-driven cache-manager="cacheManager"/>
- <!-- Spring自己的基於java.util.concurrent.ConcurrentHashMap實現的緩存管理器(該功能是從Spring3.1開始提供的) -->
- <!--
- <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
- <property name="caches">
- <set>
- <bean name="myCache" class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/>
- </set>
- </property>
- </bean>
- -->
- <!-- 若只想使用Spring自身提供的緩存器,則注釋掉下面的兩個關於Ehcache配置的bean,並啟用上面的SimpleCacheManager即可 -->
- <!-- Spring提供的基於的Ehcache實現的緩存管理器 -->
- <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
- <property name="configLocation" value="classpath:ehcache.xml"/>
- </bean>
- <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
- <property name="cacheManager" ref="cacheManagerFactory"/>
- </bean>
(注意不要忘記引入對應的命名空間)
2.在配置路徑下(這里是默認的src下)建立ehcache.xml文件,並配置程序的相關cache策略,代碼如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <ehcache dynamicConfig="false" monitoring="off" updateCheck="false"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
- <!-- 定義緩存策略
- eternal="false" // 元素是否永恆,如果是就永不過期(必須設置)
- maxEntriesLocalHeap="1000" // 堆內存中最大緩存對象數,0沒有限制(必須設置)
- overflowToDisk="false" // 當緩存達到maxElementsInMemory值是,是否允許溢出到磁盤(必須設置)
- diskPersistent="false" // 磁盤緩存在VM重新啟動時是否保持(默認為false)
- timeToIdleSeconds="0" // 導致元素過期的訪問間隔(秒為單位). 當eternal為false時,這個屬性才有效,0表示可以永遠空閑,默認為0
- timeToLiveSeconds="600" // 元素在緩存里存在的時間(秒為單位). 0 表示永遠存在不過期
- memoryStoreEvictionPolicy="LFU" // 當達到maxElementsInMemory時,如何強制進行驅逐默認使用"最近使用(LRU)"策略,其它還有先入先出FIFO,最少使用LFU,較少使用LRU
- -->
- <defaultCache eternal="false" maxEntriesLocalHeap="0" timeToIdleSeconds="300" timeToLiveSeconds="300"/>
- <cache name="myCache" maxEntriesLocalHeap="1000" />
- </ehcache>
3.既然是ehcache,肯定要引入ehcache的jar:ehcache-2.8.3,至於還需要什么jar,運行后就會發現。
4.運行后報錯,nested exception is java.lang.NoClassDefFoundError: org/aopalliance/intercept/MethodInterceptor
是因為缺少aopaliance-1.0 jar包,加入即可。
5.后台service代碼(我的注解是加在service的方法上的):
- //將查詢到的數據緩存到myCache中,並使用方法名稱加上參數中的userNo作為緩存的key
- //通常更新操作只需刷新緩存中的某個值,所以為了准確的清除特定的緩存,故定義了這個唯一的key,從而不會影響其它緩存值
- @Cacheable(value="myCache", key="#id")
- public String getUsernameById(int id){
- System.out.println("調用了測試緩存的方法");
- System.out.println("數據庫中查到此用戶號[" + id + "]對應的用戶名為[" + userMapper.getUsernameById(id) + "]");
- return userMapper.getUsernameById(id);
- }
注意:springmvc有關緩存的注解主要是@Cacheable、@CachePut、@CacheEvict。關於這三個的詳細使用可參考:http://my.oschina.net/duoduo3369/blog/173924
6.第一次訪問前台頁面:
console后台有相關日志,日志如下:
第二次執行,日志如下:
程序沒有執行我加了緩存注解的方法,后台沒有日志,但是前台返回了數據,說明是從緩存里讀取的數據,即緩存配置成功。
over!
注:由於有網友找我要代碼,我就把這篇博文涉及的代碼還有前幾篇博文的代碼都上傳到了CSDN上,地址是 http://download.csdn.net/detail/tonytfjing/8302369 由於整理的比較倉促,有問題的地方歡迎大家下載探討,謝謝!