1

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

所以我想有一个@Singleton在给定的时间间隔内使用@Schedule作业查询表的所有行,假设每1 小时一次。它将有一个getCollection()方法。

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

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

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

- - -更新 - -

在与朋友交谈后,特别是 Luiggi Mendoza,他们告诉我最好的办法是使用 EHCACHE 或类似的,而不是 Singleon。我认为就是这样。

4

1 回答 1

5

你会有一个网络服务器集群吗?在这种情况下,您需要一个分布式缓存,或者您需要通过数据库更新状态。

否则,我只会在 bean 中找到一个简单的地图@ApplicationScoped

我在大量数据几乎总是相同的解决方案中使用 JPA。涉及不止一个 tomcat,因此 bean 中的纯缓存是@ApplicationScoped行不通的。为了解决这个问题,我没有二级缓存,而是缓存数据库查询的结果。这意味着每个 tomcat 都有自己的缓存。

对于每次登录,都会读取一个时间戳,如果缓存中的数据不是陈旧的,则会使用它。否则更新缓存。在数据库触发器的帮助下发生更改时更新时间戳。

@PrePersist
@PreUpdate
@PreRemove
public void newTimeStamp() {
// save a new timestamp
}

@Singleton不是 CDI 规范的一部分,所以我会避免使用它。

此外,我会保留我的客户端 bean@RequestScoped并使用@PostConstruct. 这样,您将为每个请求获得一个新的 6。

或者,如果这可能是短暂的@ViewScoped(需要 myfaces codi),@ConversationScoped或者@ViewAccessScoped(需要 myfaces codi)。

于 2013-02-11T16:50:23.283 回答