JHipster对于缓存的应用有两个层级,一种是对于DTO的缓存,另外是Hibernate第二级缓存。本文着重介绍第一种,对于DTO层的缓存。
在应用程序中往往需要对登录用户信息进行多次查询,比如验证用户的状态等等,将用户DTO放进缓存,会大大减少对数据库的访问。
JHipster支持五种缓存实现: Ehcache, Caffeine, Hazelcast, Infinispan and Memcached。以Ehcache为例,首先引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>javax.cache</groupId>
<artifactId>cache-api</artifactId>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
缓存配置代码如下:默认配置缓存对象1小时,最大缓存对象数目为100
@Configuration
@EnableCaching
public class CacheConfiguration {
private final javax.cache.configuration.Configuration<Object, Object> jcacheConfiguration;
public CacheConfiguration(JHipsterProperties jHipsterProperties) {
JHipsterProperties.Cache.Ehcache ehcache = jHipsterProperties.getCache().getEhcache();
jcacheConfiguration = Eh107Configuration.fromEhcacheCacheConfiguration(
CacheConfigurationBuilder.newCacheConfigurationBuilder(Object.class, Object.class,
ResourcePoolsBuilder.heap(ehcache.getMaxEntries()))
.withExpiry(ExpiryPolicyBuilder.timeToLiveExpiration(Duration.ofSeconds(ehcache.getTimeToLiveSeconds())))
.build());
}
@Bean
public JCacheManagerCustomizer cacheManagerCustomizer() {
return cm -> {
createCache(cm, UserRepository.USERS_BY_USER_NAME_CACHE);
};
}
private void createCache(javax.cache.CacheManager cm, String cacheName) {
javax.cache.Cache<Object, Object> cache = cm.getCache(cacheName);
if (cache == null) {
cm.createCache(cacheName, jcacheConfiguration);
}
}
}
通过以上配置,只需在repository类中添加@Cacheable注解,便实现缓存处理,代码如下:
String USERS_BY_USER_NAME_CACHE = "usersByUserName";
@Cacheable(cacheNames = USERS_BY_USER_NAME_CACHE)
Optional<ApplicationUser> findByUserName(String userName);
实现缓存以后需要注意,任何对用户信息产生变更的操作(通常位于UserService中),需要对缓存进行处理:例如
public Optional<User> activateRegistration(String key) {
log.debug("Activating user for activation key {}", key);
return userRepository.findOneByActivationKey(key)
.map(user -> {
// activate given user for the registration key.
user.setActivated(true);
user.setActivationKey(null);
userRepository.save(user);
this.clearUserCaches(user);
log.debug("Activated user: {}", user);
return user;
});
}
private void clearUserCaches(User user) {
Objects.requireNonNull(cacheManager.getCache(UserRepository.USERS_BY_USER_NAME_CACHE)).evict(user.getUserName());
}
Good Luck,
Cheers!