2012-12-21 81 views
0

AFAIK @Singleton EJB計數器適用於計數網頁瀏覽,喜歡的東西:許多頁面瀏覽量用@Singleton

@Singleton 
public class CounterBean { 
    private int hits = 1; 

    // Increment and return the number of hits 
    public int getHits() { 
     return hits++; 
    } 
} 

,對於一個頁面的Web應用程序,如Web應用程序有什麼工作正常比方說1K頁面,我們希望在每次加載時顯示每個視圖的計數器。

會爲此分配一個@Singleton嗎?我的意思是,這是高效? (有許多豆頻繁更新的單個實例)

我的猜測單個實例來管理所有的網頁計數器效率不高。想象一下,成千上萬的@RequestScoped豆在@Singleton更新Map <ViewID, Count>的,會導致沉重的併發...

更新有關調動堅持的價值觀,我在使用@PostConstruct想(從數據庫中提取),@PreDestroy(推到數據庫)註釋。

頁面查看計數器將顯示在每個視圖中。

網頁數量是動態的。

我知道Google Analytics(分析)可以完成這項工作,但問題是如何在Java EE中完成此任務。

應用服務器:Jboss的7.1

+0

這將有助於知道您正在使用哪個應用程序服務器,其中一些收集統計信息 –

+0

不過,我想知道這兩種解決方案。 (Server&Singleton) – jacktrades

回答

1

如果你真的想要實現一個頁面視圖計數器,你最好讓它持續,否則將計數從0在應用程序的每個重新部署或重新啓動。如果應用程序集羣在多臺服務器上,這些數字就不對了。

如果只是一個練習,您應該使用bean-managed concurrency,並使用包含AtomicInteger的實例的ConcurrentHashMap。請參閱這兩個類的文檔以瞭解它們的工作方式,尤其是putIfAbsent()的文檔(除非您知道所有頁面都是adavance,並且可以將計數器設置爲0的情況下預填充地圖,在這種情況下,您甚至不需要使用putIfAbsent() )。

+0

檢查更新,這不是一個練習 – jacktrades

+0

PostConstruct是在bean構建之後調用的。我想你的意思是PreDestroy。我仍然不會那樣做。首先,因爲如果容器不能正確停止,你將失去所有的臨時數據。其次,因爲threre是針對這個問題的現成解決方案,例如Google Analytics,它可以做得更好,並提供更多功能。 –

+0

是的,對不起。好。您如何從Google Analytics獲取訪問次數並顯示它們?並請評論關於這個單獨的戰略/模式效率計數意見。 – jacktrades