Guava Cacheloader从头开始

时间:2013-07-15 09:20:40

标签: java caching guava ehcache

所以我需要存储一些信息并每隔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;
}

}

1 个答案:

答案 0 :(得分:0)

你看过EhCache spring注释(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小时一样简单...一小时后,将再次调用数据库...并且您将获取新的“新闻”值......