上一篇咱们学会了如何应用Spring Boot应用过程内缓存在减速数据拜访。可能大家会问,那咱们在Spring Boot中到底应用了什么缓存呢?
在Spring Boot中通过@EnableCaching
注解自动化配置适合的缓存管理器(CacheManager),Spring Boot依据上面的程序去侦测缓存提供者:
- Generic
- JCache (JSR-107) (EhCache 3, Hazelcast, Infinispan, and others)
- EhCache 2.x
- Hazelcast
- Infinispan
- Couchbase
- Redis
- Caffeine
- Simple
除了按程序侦测外,咱们也能够通过配置属性spring.cache.type来强制指定。咱们也能够通过debug调试查看cacheManager
对象的实例来判断以后应用了什么缓存。在上一篇中,咱们也展现了如何去查看以后应用状况。
当咱们不指定具体其余第三方实现的时候,Spring Boot的Cache模块会应用ConcurrentHashMap
来存储。而理论生产应用的时候,因为咱们可能须要更多其余个性,往往就会采纳其余缓存框架,所以接下来咱们会分几篇别离介绍几个罕用优良缓存的整合与应用。
应用EhCache
本篇咱们将介绍如何在Spring Boot中应用EhCache过程内缓存。这里咱们将沿用上一篇的案例后果来进行革新,以实现EhCache的应用。
先回顾下这个根底案例的三个局部:
User实体的定义
@Entity@Data@NoArgsConstructorpublic class User { @Id @GeneratedValue private Long id; private String name; private Integer age; public User(String name, Integer age) { this.name = name; this.age = age; }}
User实体的数据拜访实现(涵盖了缓存注解)
@CacheConfig(cacheNames = "users")public interface UserRepository extends JpaRepository<User, Long> { @Cacheable User findByName(String name);}
测试验证用例(涵盖了CacheManager的注入,可用来察看应用的缓存治理类)
@Slf4j@RunWith(SpringRunner.class)@SpringBootTestpublic class Chapter51ApplicationTests { @Autowired private UserRepository userRepository; @Autowired private CacheManager cacheManager; @Test public void test() throws Exception { // 创立1条记录 userRepository.save(new User("AAA", 10)); User u1 = userRepository.findByName("AAA"); System.out.println("第一次查问:" + u1.getAge()); User u2 = userRepository.findByName("AAA"); System.out.println("第二次查问:" + u2.getAge()); }}
接下来咱们通过上面的几步操作,就能够轻松的把下面的缓存利用改成应用ehcache缓存治理。
第一步:在pom.xml
中引入ehcache依赖
<dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId></dependency>
在Spring Boot的parent治理下,不须要指定具体版本,会主动采纳Spring Boot中指定的版本号。
第二步:在src/main/resources
目录下创立:ehcache.xml
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd"> <cache name="users" maxEntriesLocalHeap="200" timeToLiveSeconds="600"> </cache></ehcache>
实现下面的配置之后,再通过debug模式运行单元测试,察看此时CacheManager曾经是EhCacheManager实例,阐明EhCache开启胜利了。或者在测试用例中加一句CacheManager的输入,比方:
@Autowiredprivate CacheManager cacheManager;@Testpublic void test() throws Exception { System.out.println("CacheManager type : " + cacheManager.getClass()); userRepository.save(new User("AAA", 10)); User u1 = userRepository.findByName("AAA"); System.out.println("第一次查问:" + u1.getAge()); User u2 = userRepository.findByName("AAA"); System.out.println("第二次查问:" + u2.getAge());}
执行测试输入能够失去:
CacheManager type : class org.springframework.cache.ehcache.EhCacheCacheManagerHibernate: select next_val as id_val from hibernate_sequence for updateHibernate: update hibernate_sequence set next_val= ? where next_val=?Hibernate: insert into user (age, name, id) values (?, ?, ?)2020-07-14 18:09:28.465 INFO 58538 --- [ main] o.h.h.i.QueryTranslatorFactoryInitiator : HHH000397: Using ASTQueryTranslatorFactoryHibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?第一次查问:10第二次查问:10
能够看到:
- 第一行输入的CacheManager type为
org.springframework.cache.ehcache.EhCacheCacheManager
,而不是上一篇中的ConcurrentHashMap
了。 - 第二次查问的时候,没有输入SQL语句,所以是走的缓存获取
整合胜利!
代码示例
本文的相干例子能够查看上面仓库中的chapter5-2
目录:
- Github:https://github.com/dyc87112/SpringBoot-Learning/
- Gitee:https://gitee.com/didispace/SpringBoot-Learning/
如果您感觉本文不错,欢送Star
反对,您的关注是我保持的能源!
本文首发:Spring Boot 2.x基础教程:EhCache缓存的应用,转载请注明出处。
欢送关注我的公众号:程序猿DD,取得独家整顿的学习资源和日常干货推送。
本系列教程点击中转目录