springmvc緩存 - cache


  前幾篇文章已經搭建了一個基本的springmvc demo,現在我們來完善下。
    相信大家寫程序的時候都接觸過緩存的概念,也都知道,數據量大的時候緩存對於提高效率是很顯著的。而緩存一般包括前台靜態資源緩存和后台查詢出來的數據緩存,這里介紹的是后者。最后感謝以下兩篇文章,本文是在他們的基礎上完成這個demo的。
http://my.oschina.net/duoduo3369/blog/173924
http://blog.csdn.net/jadyer/article/details/12257865
開始奉上代碼。

    1.在springmvc的配置文件中加入緩存配置,代碼如下:

[html]  view plain  copy
 
 print?
  1. <!-- 緩存配置(兩種) -->    
  2. <!-- 啟用緩存注解功能(請將其配置在Spring主配置文件中) -->    
  3. <cache:annotation-driven cache-manager="cacheManager"/>    
  4. <!-- Spring自己的基於java.util.concurrent.ConcurrentHashMap實現的緩存管理器(該功能是從Spring3.1開始提供的) -->    
  5. <!--     
  6. <bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">    
  7.     <property name="caches">    
  8.         <set>    
  9.             <bean name="myCache" class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean"/>    
  10.         </set>    
  11.     </property>    
  12. </bean>    
  13.  -->    
  14. <!-- 若只想使用Spring自身提供的緩存器,則注釋掉下面的兩個關於Ehcache配置的bean,並啟用上面的SimpleCacheManager即可 -->    
  15. <!-- Spring提供的基於的Ehcache實現的緩存管理器 -->    
  16. <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">    
  17.     <property name="configLocation" value="classpath:ehcache.xml"/>    
  18. </bean>    
  19. <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">    
  20.     <property name="cacheManager" ref="cacheManagerFactory"/>    
  21. </bean>   


        (注意不要忘記引入對應的命名空間)
        
    2.在配置路徑下(這里是默認的src下)建立ehcache.xml文件,並配置程序的相關cache策略,代碼如下:
    

[html]  view plain  copy
 
 print?
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <ehcache dynamicConfig="false" monitoring="off" updateCheck="false"  
  3.          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">  
  4.       
  5.     <!-- 定義緩存策略  
  6.         eternal="false"                 // 元素是否永恆,如果是就永不過期(必須設置)  
  7.         maxEntriesLocalHeap="1000"      // 堆內存中最大緩存對象數,0沒有限制(必須設置)  
  8.         overflowToDisk="false"          // 當緩存達到maxElementsInMemory值是,是否允許溢出到磁盤(必須設置)  
  9.         diskPersistent="false"          // 磁盤緩存在VM重新啟動時是否保持(默認為false)  
  10.         timeToIdleSeconds="0"           // 導致元素過期的訪問間隔(秒為單位). 當eternal為false時,這個屬性才有效,0表示可以永遠空閑,默認為0  
  11.         timeToLiveSeconds="600"         // 元素在緩存里存在的時間(秒為單位). 0 表示永遠存在不過期  
  12.         memoryStoreEvictionPolicy="LFU" // 當達到maxElementsInMemory時,如何強制進行驅逐默認使用"最近使用(LRU)"策略,其它還有先入先出FIFO,最少使用LFU,較少使用LRU  
  13.    -->  
  14.     <defaultCache eternal="false" maxEntriesLocalHeap="0" timeToIdleSeconds="300" timeToLiveSeconds="300"/>  
  15.     <cache name="myCache" maxEntriesLocalHeap="1000" />   
  16.      
  17. </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的方法上的):
    

[html]  view plain  copy
 
 print?
  1. //將查詢到的數據緩存到myCache中,並使用方法名稱加上參數中的userNo作為緩存的key    
  2. //通常更新操作只需刷新緩存中的某個值,所以為了准確的清除特定的緩存,故定義了這個唯一的key,從而不會影響其它緩存值    
  3. @Cacheable(value="myCache", key="#id")    
  4. public String getUsernameById(int id){    
  5.     System.out.println("調用了測試緩存的方法");   
  6.     System.out.println("數據庫中查到此用戶號[" + id + "]對應的用戶名為[" + userMapper.getUsernameById(id) + "]");    
  7.     return userMapper.getUsernameById(id);    
  8. }  


    注意:springmvc有關緩存的注解主要是@Cacheable、@CachePut、@CacheEvict。關於這三個的詳細使用可參考:http://my.oschina.net/duoduo3369/blog/173924
    

    6.第一次訪問前台頁面:

 

console后台有相關日志,日志如下:

     第二次執行,日志如下:

     程序沒有執行我加了緩存注解的方法,后台沒有日志,但是前台返回了數據,說明是從緩存里讀取的數據,即緩存配置成功。

     over!

注:由於有網友找我要代碼,我就把這篇博文涉及的代碼還有前幾篇博文的代碼都上傳到了CSDN上,地址是 http://download.csdn.net/detail/tonytfjing/8302369  由於整理的比較倉促,有問題的地方歡迎大家下載探討,謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM