我需要为每个用户访问的几个页面保留一个计数器。
假设我需要保留第1页和第2页的计数器.UserA访问第1页10次,因此其计数器应为10,并且 userB访问第1页5次,第2页访问7次,因此第1页的用户计数器应为5,第2页应为7。
CounterTable ( shows number of times that each page has been visited by each user)
Username Page Counter
A 1 10
B 1 5
B 2 7
为了达到这个目的,我在DB中有一个表,用于保存用户名,页码和计数器,每次用户访问页面时,db中的关联计数器都会递增。
我的问题是,如果我增加所需的计数器,每次我想要检索页面(1或2)时,用户需要等待应用程序在访问页面之前更新所需的记录。
为避免这种情况,我应该使用JMS发送异步请求来增加数据库中的计数器吗?另一个选择是使用ajax来向服务器发送异步请求。
有没有更有效的方法呢?如果不是哪一个更有效率?
答案 0 :(得分:2)
假设计数器主要用于审计目的而不是显示目的,另一种选择可能是在本地编写访问日志。我建议使用标准格式,例如NCSA Common Log格式,它定义了URL,Method和user等字段,但当然还有许多其他选项可用。您甚至可能已将此类日志记录内置到JavaEE容器或库中,只需将其打开即可。
然后,您将使用Splunk或LogStash等工具在请求流之外获取和聚合此数据,并从所有服务器收集它。通过保留这些原始访问数据,您还可以进行进一步的分析,除了特定用户查看特定页面的次数,还可以回答诸如特定用户活动的一周中几天/几天的问题等问题。您的服务器似乎比其他服务器获得更多请求?特定页面在特定时间流行吗?还有更多。
答案 1 :(得分:1)
我认为JMS将是一个更好的选择。并且代码应该以这样的方式处理错误,即使JMS或数据库存在问题,也应该对页面加载和视图产生ZERO影响。原因是此错误不会直接影响功能。
我认为结构应该是这样的:
记录用户页面视图的代码段,这实际上应该将调用发送到另一个只是执行程序的函数,该作业被推送到该执行程序中,并且该执行程序(Java Executor框架)将发送请求到: / p>
由于它已经异步,您可以选择其中之一。但JMS将提供更抽象的视图,并可用于多个项目/网站。
答案 2 :(得分:1)
使用@Asynchronous
带注释的方法或类可能会使用另一种方法。我认为oracle教程http://docs.oracle.com/javaee/7/tutorial/doc/ejb-async.htm#GKIDZ提供了一个很好的概述。
答案 3 :(得分:0)
对于类似的请求,我通过扩展和创建新的appender来使用log4j。在appender中,我使用了异步Web请求模块(日志收集器位于远程位置)。在应用程序中,我唯一做的就是创建记录器语句。我还创建了一个日志收集器应用程序,它捕获了这些请求并执行了逻辑。逻辑取决于您,要么存储到数据库,要么将其删除。由于记录器语句执行异步调用,因此它们不会阻止应用程序。
扩展log4j很简单,只需点击链接:http://logging.apache.org/log4j/2.x/manual/extending.html
即可