是否可以创建一个所有 servlet 都会使用的内存计数器?
此全局计数器将跟踪 Web 应用程序的页面浏览量,并且该计数器将特定于当前登录的用户。即该集合将为每个用户提供一个密钥。
globalCounterMap[userId].incrementCounter += 1;
Run Code Online (Sandbox Code Playgroud)
在一定的时间间隔或页面浏览量,我想将当前计数保存到mysql(插入新行),例如:
table_pageviews [id, userId, pageview_count, date]
Run Code Online (Sandbox Code Playgroud)
因此,刷新后该计数器将重置为 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 台服务器,每台服务器都有自己的内存计数器,事情仍然会正常工作,因为它们最终都会将计数刷新到数据库,然后我将简单地聚合行以获得最终计数。