如何跟踪用户查看习惯

时间:2014-04-24 05:13:56

标签: java jms java-ee-7

我需要为每个用户访问的几个页面保留一个计数器。

假设我需要保留第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来向服务器发送异步请求。

有没有更有效的方法呢?如果不是哪一个更有效率?

4 个答案:

答案 0 :(得分:2)

假设计数器主要用于审计目的而不是显示目的,另一种选择可能是在本地编写访问日志。我建议使用标准格式,例如NCSA Common Log格式,它定义了URL,Method和user等字段,但当然还有许多其他选项可用。您甚至可能已将此类日志记录内置到JavaEE容器或库中,只需将其打开即可。

然后,您将使用Splunk或LogStash等工具在请求流之外获取和聚合此数据,并从所有服务器收集它。通过保留这些原始访问数据,您还可以进行进一步的分析,除了特定用户查看特定页面的次数,还可以回答诸如特定用户活动的一周中几天/几天的问题等问题。您的服务器似乎比其他服务器获得更多请求?特定页面在特定时间流行吗?还有更多。

答案 1 :(得分:1)

我认为JMS将是一个更好的选择。并且代码应该以这样的方式处理错误,即使JMS或数据库存在问题,也应该对页面加载和视图产生ZERO影响。原因是此错误不会直接影响功能。

我认为结构应该是这样的:

记录用户页面视图的代码段,这实际上应该将调用发送到另一个只是执行程序的函数,该作业被推送到该执行程序中,并且该执行程序(Java Executor框架)将发送请求到: / p>

  1. JMS
  2. DB
  3. 由于它已经异步,您可以选择其中之一。但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

即可