1. 程式人生 > >springmvc快取 和 mybatis快取

springmvc快取 和 mybatis快取

1. 匯入相關依賴包:

<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-context-support</artifactId>
   <version>4.3.7.RELEASE</version>
</dependency>
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>1.6.2</version>
</dependency>

2. 加入ehcache的配置檔案ehcache.xml:(注意檔案的位置!)

<?xml version="1.0" encoding="UTF-8"?>  
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"  
    updateCheck="false">  
      
    <diskStore path="java.io.tmpdir" />  
      
    <defaultCache eternal="false"   
        maxElementsInMemory="1000"  
        overflowToDisk="false"   
        diskPersistent="false"   
        timeToIdleSeconds="0"  
        timeToLiveSeconds="600"   
        memoryStoreEvictionPolicy="LFU" />  
  
    <cache name="myCache"   
        eternal="false"   
        maxElementsInMemory="500"  
        overflowToDisk="false"   
        diskPersistent="false"   
        timeToIdleSeconds="0"  
        timeToLiveSeconds="300"   
        memoryStoreEvictionPolicy="LFU" />  
  
</ehcache>

3. 在springmvc的配置檔案中開啟快取功能:(注意引入名稱空間,不然會報錯!)

4. 開啟快取註解

<!-- 啟用快取註解功能 -->
<cache:annotation-driven cache-manager="cacheManager" />
<!-- 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>

5. 將快取註解寫在了service層:(控制層程式碼省略,就是呼叫一下service層)

@Cacheable(value = "myCache", key = "'UserService.findById'")
@Override
public List<User> findById(int id) {
    System.out.println("*************************************************我是快取方法*************************************************");
    List<User> list = userMapper.findById(id);
    return list;
}

value對應的是ehcache.xml檔案裡的name,相當於一個快取空間。key最好在全域性是唯一的,這裡使用的類名+方法名,因為後面可能會根據這個值對特定的快取進行清理。

6. 測試:(jsp程式碼省略,就是呼叫一下controller層,然後controller層呼叫上面加過快取註解的service層方法)

第一次呼叫,進入該方法進行了相關程式:

第二次呼叫,沒有進入該方法,直接從快取中輸出了結果:

在更新的時候,需要將該快取清除掉:

@CacheEvict(value = "myCache", key = "'UserService.findById'")
@Override
public void removeCache() {
    System.out.println("*************************************************移除了快取*************************************************");
}

再次查詢的時候就會重新進入該方法進行查詢。

加入MyBatis快取:

mybatis的一級快取是預設開啟的,二級快取有一個最簡單的開啟方法,在每個Mapper.xml檔案里加入一個<cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" />即可(注意要放到mapper標籤裡)

測試:(此處測試時先遮蔽掉了springmvc的快取)

@Override
public List<User> findById(int id) {
     System.out.println("*************************************************我是快取方法*************************************************");
     List<User> list = userMapper.findById(id);
     return list;
}

第一次訪問,對資料庫進行了查詢:

第二次訪問,沒有對資料庫進行查詢,直接使用了快取: