许多页面视图使用@Singleton进行计数

时间:2012-12-21 11:28:56

标签: design-patterns java-ee singleton ejb counter

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

1 个答案:

答案 0 :(得分:1)

如果你真的想要实现一个页面视图计数器,你最好使它持久化,否则计数将在每次重新部署或重新启动应用程序时从0重新开始。如果应用程序集群在多个服务器上,则数字不正确。

如果只是练习,则应使用bean-managed concurrency,并使用包含ConcurrentHashMapAtomicInteger的{​​{1}}个实例。请参阅这两个类的文档以了解它们的工作原理,尤其是putIfAbsent()的文档(除非您知道adavance中的所有页面并且可以使用设置为0的计数器预填充地图,在这种情况下您甚至不会需要使用putIfAbsent())。