AFAIK @Singleton EJB适用于计算页面视图,例如:
@Singleton
public class CounterBean {
private int hits = 1;
// Increment and return the number of hits
public int getHits() {
return hits++;
}
}
对于一个页面的Web应用程序可以正常工作,如果Web应用程序让我们说1K页面怎么办,并且我们希望每次加载时都显示每个视图的计数器。
@Singleton是否可以为此付出代价?我的意思是,这会是高效吗? (让许多 bean经常更新单个实例)
我猜想管理所有网页计数器的单个实例效率不高。想象一下,成千上万的@RequestScoped bean更新@Singleton中的Map <ViewID, Count>
,会导致严重的并发......
为了更新重新部署的持久值,我在考虑使用@PostConstruct
(从数据库中提取),@PreDestroy
(推送到数据库)注释。
页面视图计数器将显示在每个视图中。
网页数量是动态的。
我了解Google Analytics可以胜任这项工作,但问题是如何在Java EE中实现这一目标。
App Server:Jboss 7.1
答案 0 :(得分:1)
如果你真的想要实现一个页面视图计数器,你最好使它持久化,否则计数将在每次重新部署或重新启动应用程序时从0重新开始。如果应用程序集群在多个服务器上,则数字不正确。
如果只是练习,则应使用bean-managed concurrency,并使用包含ConcurrentHashMap
个AtomicInteger
的{{1}}个实例。请参阅这两个类的文档以了解它们的工作原理,尤其是putIfAbsent()
的文档(除非您知道adavance中的所有页面并且可以使用设置为0的计数器预填充地图,在这种情况下您甚至不会需要使用putIfAbsent()
)。