Spring-Boot-2x基础教程EhCache缓存的使用

7次阅读

共计 3222 个字符,预计需要花费 9 分钟才能阅读完成。

上一篇咱们学会了如何应用 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
@NoArgsConstructor
public 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)
@SpringBootTest
public 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 的输入,比方:

@Autowired
private CacheManager cacheManager;

@Test
public 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.EhCacheCacheManager
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: 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 ASTQueryTranslatorFactory
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ where user0_.name=?
第一次查问:10
第二次查问:10

能够看到:

  1. 第一行输入的 CacheManager type 为 org.springframework.cache.ehcache.EhCacheCacheManager,而不是上一篇中的ConcurrentHashMap 了。
  2. 第二次查问的时候,没有输入 SQL 语句,所以是走的缓存获取

整合胜利!

代码示例

本文的相干例子能够查看上面仓库中的 chapter5-2 目录:

  • Github:https://github.com/dyc87112/SpringBoot-Learning/
  • Gitee:https://gitee.com/didispace/SpringBoot-Learning/

如果您感觉本文不错,欢送 Star 反对,您的关注是我保持的能源!

本文首发:Spring Boot 2.x 基础教程:EhCache 缓存的应用,转载请注明出处。
欢送关注我的公众号:程序猿 DD,取得独家整顿的学习资源和日常干货推送。
本系列教程点击中转目录

正文完
 0