我希望能够在登录页面上显示新闻。(例如由于服务器维护等导致的停机时间)
新闻将从数据库加载。但是,因为新闻很少会改变,所以应该缓存而不是每次加载应用程序时都加载。
这是我卡住的地方:如何缓存新闻?此外,我想每 10 分钟从数据库加载一次新闻,否则从缓存中加载。这可能吗?
或者,也许你可以给我推荐一个更好的灵魂。
提前谢谢了。
莱奥斯蒂夫
我希望能够在登录页面上显示新闻。(例如由于服务器维护等导致的停机时间)
新闻将从数据库加载。但是,因为新闻很少会改变,所以应该缓存而不是每次加载应用程序时都加载。
这是我卡住的地方:如何缓存新闻?此外,我想每 10 分钟从数据库加载一次新闻,否则从缓存中加载。这可能吗?
或者,也许你可以给我推荐一个更好的灵魂。
提前谢谢了。
莱奥斯蒂夫
最后我决定通过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();
}
}
如果要跨页面存储数据,可以使用@SessionScoped bean 来保存数据。
您可以使用 Cookie 来存储多个会话之间的数据。
就每 10 分钟请求一次 DB 而言..,
通常每 10 分钟发送一次 ajax 调用,您可以使用 PRIEMFACE 的PRIME PUSH技术[Link]。
它是基于反向 ajax 技术构建的,当数据更新时,将发送反向 ajax 调用以从托管 bean 更新 JSF 组件。
您可以同时使用数据库触发器。
编辑:正如 Luiggi Mendoza 在以下评论中建议的那样,使用 @ApplicationScope 将解决该问题。