所以我需要存储一些信息并每隔1小时从我的数据库重新加载一次。我环顾四周,发现 googles guava cacheloader 或 ehcache 将是最好,最简单的解决方案。
我搜索谷歌过去4个小时并没有找到任何可以帮助我的东西,我是一个真正的新手,我第一次需要缓存一些东西。请帮帮我。
Follwoing问题:
我有一个名为新闻的实体,我会根据他们的可用性随意存储新闻并加载它们。我这是 @ViewScoped bean。但是,我不需要每次加载页面时加载新闻,新闻不会被频繁修改。这就是为什么我要将新闻(List< News>)存储在缓存中并分别加载它们。缓存应该每1小时刷新一次。
关于bean,缓存监听器等请帮帮我。我真的不知道如何重新加载数据,我是否必须使用bean等。
这是我的 @ViewScoped NewsController :
@ViewScoped
public class NewsController extends BaseController implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext
protected EntityManager em;
private List<News> newsList;
@PostConstruct
public void init() {
getAvailableNews();
}
public void getAvailableNews() {
if (newsList == null) {
info("#############Load news from DB!##########");
newsList = new LinkedList<News>();
@SuppressWarnings("unchecked")
List<News> result = (List<News>) em.createNativeQuery(
"SELECT * FROM news WHERE sysdate BETWEEN from AND to+1",
News.class).getResultList();
for (News n : result) {
newsList.add(n);
}
}
}
public void reload(){
newsList = null;
getAvailableNews();
}
public List<News> getNewsList() {
return newsList;
}
public void setNewsList(List<News> newsList) {
this.newsList = newsList;
}
}
答案 0 :(得分:0)
只需在getAvailableNews()方法上方添加@Cacheable(name =“getAvailableNews”),框架就会自动为您缓存结果(第一次调用数据库,获取结果并缓存它们。 ..下次,直接从缓存中获取)
为了使这个工作,你需要改变你的类构造...我会删除“newsList”实例变量...这是造成不一致和麻烦的原因......(你可能会这样做来构建一些一种本土的“缓存”,我可以理解)并更新你的getAvailableNews()方法来实际返回List对象......
@Cacheable(name="getAvailableNews")
public List<News> getAvailableNews() {
info("#############Load news from DB!##########");
return (List<News>) em.createNativeQuery(
"SELECT * FROM news WHERE sysdate BETWEEN from AND to+1",
News.class).getResultList();
}
最后,使用EhCache,您可以设置缓存条目的时间期限...因此,对于您的情况,可能就像将新闻项目的TimeToLive值设置为1小时一样简单...一小时后,将再次调用数据库...并且您将获取新的“新闻”值......