Spring 使用 Ehcache @CacheEvict 进行缓存不起作用
Spring Cache with Ehcache @CacheEvict doesn't work
我在 UserService 中有下一个方法:
@Cacheable(value = "user", key="#p0")
public User find(String user) {
return userRepository.findByUser(User);
}
缓存很好。在其他服务中我有:
@Transactional
public void updateToken(int id, String token) {
Group group = groupRepository.findOne(id);
group.getMembers().forEach(member -> {
member.getUser().setToken(token);
removeUserCacheByName(member.getUser().getName());
});
groupRepository.save(group);
}
@CacheEvict(value = "user", key="#p0")
public void removeUserCacheByName(String name) {
log.debug("Removing user cache by name {}.", name);
}
updateToken 方法后,缓存没有清除。
您所看到的是正常的。您从 Proxy 对象中调用 removeUserCacheByName()
,因此捕获方面不会执行。 documentation.
中解释了此行为
您可以采取一些措施来解决此问题:
1) 将 evict 方法 (removeUserCacheByName
) 带到另一个 bean,在 updateToken() 的 class 中自动装配它,然后调用它。
2) 一个丑陋但有用的方法,自动装配 ApplicationContext,从中获取相同的对象并调用该方法,例如:
public class UserService{
@Autowired
private ApplicationContext ac;
@Transactional
public void updateToken(int id, String token) {
Group group = groupRepository.findOne(id);
group.getMembers().forEach(member -> {
member.getUser().setToken(token);
UserService sameBean = ac.getBean(UserService.class);
sameBean.removeUserCacheByName(member.getUser().getName());
});
groupRepository.save(group);
}
@CacheEvict(value = "user", key="#p0")
public void removeUserCacheByName(String name) {
log.debug("Removing user cache by name {}.", name);
}
}
我在 UserService 中有下一个方法:
@Cacheable(value = "user", key="#p0")
public User find(String user) {
return userRepository.findByUser(User);
}
缓存很好。在其他服务中我有:
@Transactional
public void updateToken(int id, String token) {
Group group = groupRepository.findOne(id);
group.getMembers().forEach(member -> {
member.getUser().setToken(token);
removeUserCacheByName(member.getUser().getName());
});
groupRepository.save(group);
}
@CacheEvict(value = "user", key="#p0")
public void removeUserCacheByName(String name) {
log.debug("Removing user cache by name {}.", name);
}
updateToken 方法后,缓存没有清除。
您所看到的是正常的。您从 Proxy 对象中调用 removeUserCacheByName()
,因此捕获方面不会执行。 documentation.
您可以采取一些措施来解决此问题:
1) 将 evict 方法 (removeUserCacheByName
) 带到另一个 bean,在 updateToken() 的 class 中自动装配它,然后调用它。
2) 一个丑陋但有用的方法,自动装配 ApplicationContext,从中获取相同的对象并调用该方法,例如:
public class UserService{
@Autowired
private ApplicationContext ac;
@Transactional
public void updateToken(int id, String token) {
Group group = groupRepository.findOne(id);
group.getMembers().forEach(member -> {
member.getUser().setToken(token);
UserService sameBean = ac.getBean(UserService.class);
sameBean.removeUserCacheByName(member.getUser().getName());
});
groupRepository.save(group);
}
@CacheEvict(value = "user", key="#p0")
public void removeUserCacheByName(String name) {
log.debug("Removing user cache by name {}.", name);
}
}