是否有可能創建所有servlet都將使用的內存計數器?全局內存計數器,線程安全並每x增量刷新到mysql
此全局計數器將跟蹤Web應用程序的綜合瀏覽量,計數器將特定於當前登錄的用戶。即該集合將對每個用戶都有一個關鍵。
globalCounterMap[userId].incrementCounter += 1;
在一定的時間間隔或計數的瀏覽量,我想保存當前計數到MySQL(插入新行),例如:
table_pageviews [id, userId, pageview_count, date]
所以這個計數器隨後會後重置爲0沖洗。
所以,如果我有一個BaseServlet,所有的servlet將繼承,我將如何定義此字段? (最後,靜態?)
ConcurrentHashMap是否合適?也許我可以爲每個條目存儲AtomicLong的值。 http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/atomic/AtomicLong.html
我必須沖洗到MySQL過程中同步:
在沖洗,我可以通過設置爲0,並保存我「獲取」值,用原子長的getAndSet? (說我這樣做是每1K瀏覽量)
更新
所以,即使我有10個服務器,每個都有自己的內存計數器,事情仍會起作用,因爲他們都將最終刷新它們的計數數據庫,然後我會簡單地聚合行以獲得最終的計數。
爲什麼沒有MemcacheD服務器,並將其每小時或分鐘刷新到DB? MemcachedD IO足夠快,並且它將始終保存用戶的總頁面瀏覽量。 – Nishant