SpringMVC + ehcache(google ehcache-spring-annotations),基于注解解决服务器端数据缓存。
1. 下载所需jar包
1. Ehcache的jar:
ehcache-2.7.1.jar
slf4j-api-1.6.6.jar
slf4j-jdk14-1.6.6.jar
down下来之后lib里面会有以上三个包(这两个slf4j的包一般项目里会有,换成最新的版本即可),下载地址如下:
2. ehcache-spring-annotations 的jar:
ehcache-spring-annotations-1.2.0.jar
ehcache-spring-annotations-1.2.0-sources.jar
2. 配置
1. ehcacheApplication.xml,该文件里面配置基本不变,需要将该文件加入web.xml
- <?xml version="1.0" encoding="UTF-8"?>
- <beans xmlns="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:ehcache="http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring"
- xsi:schemaLocation="
- http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
- http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring
- http://ehcache-spring-annotations.googlecode.com/svn/schema/ehcache-spring/ehcache-spring-1.1.xsd">
- <ehcache:annotation-driven />
- <ehcache:config cache-manager="cacheManager">
- <ehcache:evict-expired-elements interval="60" />
- </ehcache:config>
- <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
- <property name="configLocation" value="classpath:spring/ehcache.xml"/>
- </bean>
- </beans>
2. web.xml
- <context-param>
- <param-name>contextConfigLocation</param-name>
- <param-value>classpath:spring/applicationContext.xml,classpath:spring/ehcacheApplication.xml</param-value>
- </context-param>
3. 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">
- <diskStore path="java.io.tmpdir/ehcache_hsrj"
- <defaultCache
- maxElementsInMemory="3000"
- eternal="false"
- timeToIdleSeconds="3600"
- timeToLiveSeconds="3600"
- overflowToDisk="true"
- diskPersistent="false"
- diskExpiryThreadIntervalSeconds="100"
- memoryStoreEvictionPolicy="LRU"
- />
- <cache name="methodCache"
- maxElementsInMemory="3000"
- eternal="false"
- overflowToDisk="true"
- timeToIdleSeconds="36000"
- timeToLiveSeconds="36000"
- memoryStoreEvictionPolicy="LFU"
- />
- </ehcache>
3. 代码
1. 缓存
给你需要缓存的方法加上如下这句
- @Cacheable(cacheName = "methodCache")
- public int find() {
- List<Car> list=carDao.findCar();
- Return list.size();
- }
cacheName里面对应ehcache.xml中配置的<cache name="methodCache" ,
这里我想说,网上很多人都是加到dao上的,我是直接加到service(业务层)里面的方法上,因为我的业务层方法会对数据做处理,而我需要缓存整个处理结果,所以加到service里面的方法上是可以的。
2. 清除缓存
- @TriggersRemove(cacheName="methodCache",removeAll=true)
- public void flush(){
- log.info("清除缓存!");
- }
cacheName里面对应缓存里面的名称,removeAll=true 这句是必须加的,否则无法清除缓存。
4. 测试
1. 我的测试方法是,在控制层提供了两个方法,缓存和清除缓存,分别调用service中的两个方法find与flush,缓存方法将service中返回的size返给页面,在浏览器里面去请求这两个方法。
2. 首次请求缓存方法,发现后台打印sql查询信息,再在数据库中添加数据,再次请求缓存方法,发现后台不打印sql查询信息,页面显示list的size不变。证明缓存成功。
3. 请求清除缓存方法。
4. 再次请求缓存方法,会发现后台打印sql查询信息,页面显示list的size发生变化。证明清除缓存成功。
5. 其他
1.对于清除缓存的方法,ehcache提供了两种,一种是在ehcache.xml中配置的时间过后自动清除,一种是在数据发生变化后触发清除。个人感觉第二种比较好。可以将
@TriggersRemove(cacheName="methodCache",removeAll=true)
这句代码加到service里面的添加、删除、修改方法上。这样只要这几个方法有调用,缓存自动清除。
2. 如果是通过触发的方式清除缓存,那时间可以配置为永不过期。在ehcache.xml中将eternal="true" 设置为true,超时设置将被忽略,在未触发清除缓存方法之前,对象从不过期。
参考的资料url:http://doc.okbase.net/yunzhu/archive/101034.html