0

所以我需要存储一些信息并每 1 小时从我的数据库中重新加载一次。我环顾四周,发现googles guava cacheloaderehcache将是最好和最简单的解决方案。

我在过去的 4 个小时里搜索了谷歌并没有找到任何可以帮助我的东西,我是一个真正的新手,我第一次需要缓存一些东西。请帮帮我。

以下问题:

我有一个名为News的实体,我在其中存储新闻并根据它们的可用性加载它们。我这样做是@ViewScoped bean。但是,我不需要每次加载页面时都加载新闻,新闻不会被频繁修改。这就是为什么我要将News(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;
}

}

4

1 回答 1

0

你看过 EhCache 弹簧注释(http://ehcache.org/documentation/recipes/spring-annotations)吗?看起来这正是你需要的......

只需在 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 小时一样简单...一小时后,调用将再次创建数据库...您将获取新的“新闻”值...

于 2013-07-15T18:01:12.793 回答