2013-07-15 29 views
0

所以我需要存储一些信息,并从我的数据库每1小时重新加载它。我环顾四周,发现网上搜寻番石榴的CacheLoader的Ehcache将是最好的,最简单的解决方案。番石榴Cacheloader从零开始

我搜索谷歌在过去的4小时,没有发现anyhting,可以帮助我,我是一个真正的新手,我第一次需要缓存的东西。请帮助我。

Follwoing问题:

我有一个名为新闻,我obisouly店新闻,并根据他们的availibilty加载它们的实体。我是这样做的:@ViewScoped bean。但是,每次页面加载时我都不需要加载新闻,新闻不会频繁修改。这就是为什么我要将新闻(列表<新闻>)存储在缓存中并分别加载它们。缓存应该每1小时刷新一次。

请帮我关于豆,缓存监听等我真的不知道如何重新加载数据,我必须用绿豆等

这是我@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

你看着的Ehcache Spring注解(http://ehcache.org/documentation/recipes/spring-annotations)?似乎这正是你在这里所需要的...

只需在你的getAvailableNews()方法上添加@Cacheable(name =“getAvailableNews”),框架就会自动为你缓存结果(第一次调用数据库,获取结果回来了,......下一次缓存起来,直接从缓存)

对于这个工作,虽然,你需要改变一点你的类结构得到它。我将消除“新闻列表”实例变量...这是引起矛盾和烦恼......(你可能这样做是为了建立某种土生土长的“缓存”,这我能理解)和更新您的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小时...一小时后一样简单,拨打数据库的电话将重新...并且您将获取新的“新闻”值...

+0

@Ianimall感谢您的回应。我在哪里设定计时器? – leostiw

+0

@Ianimall我不想使用Spring,而是使用EJB。 – leostiw

+0

公顷EJB ......在这种情况下,我会用的Ehcache在客户端,基本上封装EJB调用到getAvailableNewsCached()方法的客户端...基本概念:从缓存中读取第一......如果从缓存空的结果,取来自EJB并存储在缓存中。对于计时器,它全部在ehcache.xml中设置。有关ehcache配置的详细信息,请查阅http://ehcache.org/documentation/configuration/configuration。另外,入门指南很好:http://ehcache.org/documentation/get-started/getting-started和 – lanimall