我希望能够在登录页面上显示新闻。 (例如引起服务器维护等的停机时间)缓存新闻刷新10 miunte周期
这个消息将来自DB加载。但是,由于消息很少会发生变化,因此应该是缓存,并且每次加载应用程序时都不会加载。
这里是我被困住的地方:如何缓存消息?另外,我想从DB每10分钟加载一次消息,否则从缓存中加载。这可能吗?
或者,也许你可以推荐我一个更好的soultion。
非常感谢提前。
Leostiw
我希望能够在登录页面上显示新闻。 (例如引起服务器维护等的停机时间)缓存新闻刷新10 miunte周期
这个消息将来自DB加载。但是,由于消息很少会发生变化,因此应该是缓存,并且每次加载应用程序时都不会加载。
这里是我被困住的地方:如何缓存消息?另外,我想从DB每10分钟加载一次消息,否则从缓存中加载。这可能吗?
或者,也许你可以推荐我一个更好的soultion。
非常感谢提前。
Leostiw
如果你想存储跨页,你可以使用@SessionScoped bean保存数据为目的的数据。
您可以使用Cookie在多个会话之间存储数据。
至于请求DB每隔10分钟关注..,
通常一个将发送Ajax调用每隔10分钟,而不是您可以使用PRIEMFACE的PRIME PUSH技术[Link]。
这是基于反向ajax技术构建的,其中在更新数据时将发送反向ajax调用以从Managed bean更新JSF组件。
您可以使用数据库触发器。
编辑: 由于Luiggi Mendoza在下面的评论中建议使用@ApplicationScope将解决这个问题。
最后我决定做刷新周期支持波谷EJB计时器服务。
这是我的解决方案:
的@ApplicationScoped豆(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;
}
}
我addede另外一个@Stateless豆(NewsScheduler)这就要求我getAvailableNews()每10新闻控制器中的miuntes:
@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();
}
}
感谢您的回答!在范围内,我不想跨页面存储数据,我只需要将消息加载一次/会话,即登录。在处理登录后,我不再需要这个消息。实际上我使用** @ RequestScoped ** bean。但这不是我的主要观点。每次创建会话时,我都不想访问数据库。该消息应该从缓存中加载。缓存应该每10分钟更新一次。关于** primefaces推**,我不认为我可以用这个purpouse,对吧? (session independent) – leostiw
@leostiw我不会推荐使用'@SessionScoped',因为消息应该可用于应用程序中的所有用户,并且不需要在每次新会话开始时恢复。你可以使用'@ ApplicationScoped'来存储新闻,甚至更好,使用像[ehcache](http://stackoverflow.com/q/14712626/1065197)或[infinispan](http:// www。jboss.org/infinispan/)来存储和检索你的'@ ViewScoped'托管bean的新闻。 –
@LuiggiMendoza谢谢你的答案!在这种情况下,我将使用'@ ApplicationScoped' bean。有一个问题,在这种情况下将存储的数据在哪里?重新加载周期,我应该使用线程,你会推荐什么? – leostiw