用于保存行集合的Singleton

时间:2013-02-11 15:21:30

标签: jsf java-ee-6 cdi ejb-3.1

在Web App中,需要通过每页JSF显示6个对象(表DB的行)的视图。要前进到下一个视图,将显示另一个不同的随机6个对象,依此类推......

所以我在考虑让 @Singleton 在给定的时间间隔内用 @Schedule 作业查询表的所有行,比方说每1小时一次。它将具有 getCollection()方法。

然后每个访问者都会有一个 @SessionScoped CDI bean,它将查询 @Singleton 的集合,然后将其随机播放以对特定用户进行随机查看。

与许多访问一样,将创建许多将同时访问getCollection()方法的CDI bean。

这是否正确?这种情况需要任何特定的注释吗?还有其他方法吗?

----- --- UPDATE

在与朋友,特别是Luiggi Mendoza交谈后,他们告诉我,这里最好的事情是使用EHCACHE或类似的,而不是单身人士。我认为就是这样。

1 个答案:

答案 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)。