首先要有一个搭建好的 ssm 框架, 笔者使用的是基于 maven 搭建的 ssm 框架.
加入 spring 缓存:
1. 导入 POM 相关依赖包: 如果 maven 项目无法下载 ehcache 的的相关 jar 包, 需要自己手工导入, 见文件中
- <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. 开启缓存注解
- 1
- <!-- 启用缓存注解功能, 这个是必须的, 否则注解不会生效, 另外, 该注解一定要声明在 spring 主配置文件中才会生效 -->
- 2 <cache:annotation-driven cache-manager="cacheManager" />
- 3 <!-- spring 提供的基于的 ehcache 实现的缓存管理器 -->
- 4 <bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
- 5 <property name="configLocation" value="classpath:ehcache.xml" />
- 6 </bean>
- 7 <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
- 8 <property name="cacheManager" ref="cacheManagerFactory" />
- 9 </bean>
注意: cache:annotation-driven/ 放在 Spring MVC 的配置文件里, Controller 里调用, 缓存是生效的, Junit 不生效.
放到 Spring 的配置文件里, Controller 调用缓存是不生效的, Junit 生效.
所以, 如果 Spring 和 Spring MVC 的配置文件是分开的, 最好把 cache:annotation-driven / 在两边都加上.
至于为什么, 我还不清楚.
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;
- }
第一次访问, 对数据库进行了查询:
第二次访问, 没有对数据库进行查询, 直接使用了缓存:
源码下载: http://files.cnblogs.com/files/ImNemo/ssm-cache.rar
原作者地址:
来源: http://www.bubuko.com/infodetail-3395110.html