用于保存行集合的Singleton

jac*_*des 1 jsf cdi java-ee-6 ejb-3.1

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

所以我在具有思维@Singleton,查询与该表中的所有行@Schedule在给定的时间间隔工作,比方说,每隔1小时.它将有一个getCollection()方法.

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

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

这是正确的吗?这种情况需要任何特定的注释吗?这样做的其他任何方式?

----- UPDATE ---

与朋友沟通后,特意Luiggi门多萨,他们告诉我,在这里最好的办法是使用的Ehcache或类似的,而不是Singleon.我认为就是这样.

Kar*_*dén 5

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

另外,我只想在一个bean中找到一个简单的地图@ApplicationScoped.

我在一个解决方案中使用JPA,其中大量数据几乎总是相同的.有超过一个tomcat参与,因此bean中的纯缓存@ApplicationScoped将无法工作.要修复它,我没有二级缓存,而是缓存数据库查询的结果.这意味着每个tomcat都有自己的缓存.

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

@PrePersist
@PreUpdate
@PreRemove
public void newTimeStamp() {
// save a new timestamp
}
Run Code Online (Sandbox Code Playgroud)

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

此外,我会保留我的客户端bean @RequestScoped并重新加载6个对象@PostConstruct.这样你就可以获得每个请求的新鲜6.

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