【发布时间】:2011-12-12 16:20:27
【问题描述】:
是否可以创建一个所有 servlet 都将使用的内存计数器?
此全局计数器将跟踪 Web 应用程序的综合浏览量,并且该计数器将特定于当前登录的用户。即集合将为每个用户提供一个密钥。
globalCounterMap[userId].incrementCounter += 1;
在某个时间间隔或浏览量计数,我想将当前计数保存到 mysql(插入新行)例如:
table_pageviews [id, userId, pageview_count, date]
因此,此计数器将在刷新后重置为 0。
如果我有一个所有 servlet 都将从中继承的 BaseServlet,我将如何定义该字段? (最终的,静态的?)
ConcurrentHashMap 合适吗?也许我可以为每个条目的值存储一个 AtomicLong。
在刷新期间,我可以通过设置为 0 来使用原子 long 的 getAndSet,并保存我“获取”的值:http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/atomic/AtomicLong.html
在刷新到 mysql 过程中是否必须同步? (假设我每 1K 页面浏览量执行一次)
更新
因此,即使我有 10 台服务器,每台服务器都有自己的内存计数器,事情仍然会正常工作,因为它们最终都会将它们的计数刷新到数据库,然后我将简单地聚合行以获得最终计数。
【问题讨论】:
-
为什么不拥有 MemcacheD 服务器,并且每小时或每分钟将其刷新到数据库? MemcachedD IO 速度足够快,并且它始终会保存用户的总页面浏览量。
标签: java servlets concurrency