Có cách nào dễ dàng để sử dụng chú thích @Cacheable
của Spring với bean không phải là singleton (ví dụ: phiên phạm vi) và có bộ nhớ cache có cùng phạm vi với bean đã nói không?Chú thích @Cacheable của Spring có thể có cùng phạm vi với bean của phương thức được chú thích không?
Ví dụ:
import javax.inject.Inject;
import javax.inject.Named;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.context.annotation.Scope;
import org.springframework.security.core.context.SecurityContextHolder;
@Named
@Scope("session")
public class UserNameRetriever {
@Inject private UserDao userDao;
@Cacheable("userName")
public String getUserName() {
return userDao.getUserByLogin((String)SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getName();
}
}
Lý tưởng nhất, UserNameRetriever.getUserName()
sẽ lấy tên người dùng từ UserDao
lần mỗi phiên, nhưng mã này thực sự lưu trữ ứng dụng rộng rãi.
này hoạt động, nhưng có một rò rỉ bộ nhớ mà không ( \t \ @CacheEvict (value = "userName", key = "# root.target") \t \ @PreDestroy \t public void dọn dẹp() { \t} ) Ngoài ra, tôi đã quyết định không sử dụng @Cacheable sau khi tất cả, vì nó không đảm bảo rằng giá trị sẽ được tính chỉ một lần. –
Bạn có ý gì khi rò rỉ bộ nhớ? Có thể bộ nhớ cache của bạn quá lớn. @Cacheable sẽ tra cứu trong bộ nhớ cache trước, do đó, nó đảm bảo rằng giá trị sẽ không được tính trong khi vẫn còn trong bộ nhớ cache. – sinuhepop
Đó là một rò rỉ bộ nhớ bởi vì sau khi phiên kết thúc, giá trị vẫn còn trong bộ nhớ cache, nhưng không thể truy cập được. @PreDestroy đảm bảo rằng giá trị được lưu trong bộ nhớ cache được loại bỏ khi phiên kết thúc. –