在Web App中,需要通过每页JSF显示6个对象(表DB的行)的视图。要前进到下一个视图,将显示另一个不同的随机6个对象,依此类推......
所以我在考虑让 @Singleton 在给定的时间间隔内用 @Schedule 作业查询表的所有行,比方说每1小时一次。它将具有 getCollection()方法。
然后每个访问者都会有一个 @SessionScoped CDI bean,它将查询 @Singleton 的集合,然后将其随机播放以对特定用户进行随机查看。
与许多访问一样,将创建许多将同时访问getCollection()方法的CDI bean。
这是否正确?这种情况需要任何特定的注释吗?还有其他方法吗?
----- --- UPDATE
在与朋友,特别是Luiggi Mendoza交谈后,他们告诉我,这里最好的事情是使用EHCACHE或类似的,而不是单身人士。我认为就是这样。
答案 0 :(得分:5)
您是否拥有一组网络服务器?在这种情况下,您需要分布式缓存,或者需要通过数据库更新状态。
否则我只想在@ApplicationScoped
的bean中找到一个简单的地图。
我在一个解决方案中使用JPA,其中大量数据几乎总是相同的。有一个超过一个tomcat涉及到一个bean @ApplicationScoped
中的纯缓存将无法正常工作。要修复它,我没有二级缓存,而是缓存数据库查询的结果。这意味着每个tomcat都有自己的缓存。
对于每次登录,读取时间戳,如果缓存中的数据不是陈旧的,则使用它。否则缓存将更新。在数据库触发器的帮助下发生更改时,时间戳会更新。
@PrePersist
@PreUpdate
@PreRemove
public void newTimeStamp() {
// save a new timestamp
}
@Singleton
不是CDI规范的一部分,所以我不会使用它。
此外,我会保留我的客户端bean @RequestScoped
并使用@PostConstruct
重新加载6个对象。这样,每次请求都会获得新的6。
或者如果那是短暂的,可能@ViewScoped
(需要myfaces codi),@ConversationScoped
或@ViewAccessScoped
(需要myfaces codi)。