1

我希望能够在登录页面上显示新闻。(例如由于服务器维护等导致的停机时间)

新闻将从数据库加载。但是,因为新闻很少会改变,所以应该缓存而不是每次加载应用程序时都加载。

这是我卡住的地方:如何缓存新闻?此外,我想每 10 分钟从数据库加载一次新闻,否则从缓存中加载。这可能吗?

或者,也许你可以给我推荐一个更好的灵魂。

提前谢谢了。

莱奥斯蒂夫

4

2 回答 2

0

最后我决定通过EJB Timer Service进行刷新循环。

这是我的解决方案:

@ApplicationScoped Bean (NewsController ) :

@ApplicationScoped
public class NewsController extends BaseController implements Serializable {
private static final long serialVersionUID = 1L;

@PersistenceContext
protected EntityManager em;

private List<News> newsList;

public NewsController() {
}

@PostConstruct
public void init() throws ExecutionException {
    getAvailableNews();
}

public void getAvailableNews() {
    if (newsList == null) {
        newsList = new LinkedList<News>();
        Query q = em.createNativeQuery(
                "SELECT * FROM news WHERE sysdate BETWEEN ab AND bis+1",
                News.class);
        @SuppressWarnings("unchecked")
        List<News> result = q.getResultList();
        for (News n : result)
            newsList.add(n);
    }
}

public List<News> getNewsList() {
    return newsList;
}

public void setNewsList(List<News> newsList) {
    this.newsList = newsList;
}

}

我另外添加了一个@Stateless Bean (NewsScheduler),它在 NewsController 中每 10 分钟调用一次我的 getAvailableNews():

@Stateless
public class NewsScheduler {

@Inject
NewsController newsController;

@Schedule(hour = "*", minute = "*/5")
public void reload() {
    System.out.println("---------------- Laden der News aus der DB --------------");
    newsController.setNewsList(null);
    newsController.getAvailableNews();
}

}
于 2013-07-16T13:23:18.647 回答
0

如果要跨页面存储数据,可以使用@SessionScoped bean 来保存数据。
您可以使用 Cookie 来存储多个会话之间的数据。
就每 10 分钟请求一次 DB 而言..,
通常每 10 分钟发送一次 ajax 调用,您可以使用 PRIEMFACE 的PRIME PUSH技术[Link]
它是基于反向 ajax 技术构建的,当数据更新时,将发送反向 ajax 调用以从托管 bean 更新 JSF 组件。
您可以同时使用数据库触发器。

编辑:正如 Luiggi Mendoza 在以下评论中建议的那样,使用 @ApplicationScope 将解决该问题。

于 2013-07-11T11:15:18.967 回答