Singleton持有行集合



在Web应用程序中,需要通过JSF每页显示6个对象(表DB的行)的视图。要进入下一个视图,另一个不同的随机6个对象将被显示,依此类推…

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

然后,每个访问者都将有一个@SessionScopedCDIbean,它将查询@Singleton的Collection,然后对其进行洗牌,以对特定用户进行随机查看。

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

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

-----更新---

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

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

否则,我只会在一个bean中寻找一个简单的映射,即@ApplicationScoped

我在一个解决方案中使用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(需要myface codi)。

相关内容

  • 没有找到相关文章

最新更新