我有一个web应用程序,我的客户请求他想知道。
我想出了两个主意。
我想验证一下我的想法是否正确。
这些是客户的要求。
谁:访问者是谁(例如,remoteAddress-IP)
时间:访问者在web应用程序上做了一些事情
事件:访问者采取了什么具体操作,比如“按下打印按钮”
where:哪个页面,例如访问者访问的URL
我的想法1.
只需发出一个SQL查询,即可记录每个访问网站的用户的活动。如果访问者单击某个页面的链接,web应用程序会将用户活动写入数据库并呈现所请求的页面。
我认为这将对用户体验产生不良影响。页面渲染可能会变慢,因为它必须做额外的工作。这种方法最终会发出过多的SQL查询并最终成为一个坏主意吗?
我的想法2.
为每个用户或每个用户活动启动一个新线程。页面渲染以其自身的速度进行,日志记录将在线程中单独完成。
我认为这可能会创建太多的线程。这是个好主意,还是最终会占用太多资源?
我想知道这些是不是一个好的,现实世界的实践。如果有更好的方法,请分享。:)
发布于 2013-04-03 13:42:43
建议1:使用和不使用数据库日志记录系统分析应用程序。您可能会发现,无需重大架构更改或性能调优,DB日志记录就能满足您的性能需求。
如果您发现能够满足吞吐量需求,但偶尔会在高峰期进行备份,则可以将数据库日志记录移动到单个线程中,并使用来自java.util.concurrent的并发队列传递日志消息。这将比为每个日志事件派生单独的线程效率高得多。
我怀疑如果你发现一个性能问题,你会发现瓶颈是数据库。但这只是一种预感--您必须分析您自己的设置,以找到其优缺点。
注意:要比较启用和不启用日志记录的性能,您可以在启动时将打开/关闭布尔值或特定日志级别配置为最终静态变量。如果这些条件被保证为假,则JIT将优化出if (loggingEnabled)或if (logLevel > 3)块中包含的任何代码。这使您可以在有日志记录和没有日志记录的情况下运行相同的代码,而不会在分析当前(非日志)方法时为日志记录代码付出性能损失。
发布于 2016-02-29 21:34:21
出于性能原因,最好将日志处理与页面呈现分开,这可以使用JMS来完成。
当用户执行某些操作时,您需要做的就是创建日志对象并使用消息源发送JMS消息(JMS队列应该是合适的)。
在另一端(消息接收器),您需要设置一个消息接收器来接收消息并记录它们(在本例中为DB )。
这种解耦确保对用户活动的影响最小,并为使用操作提供可靠的日志记录。
发布于 2013-04-03 13:30:43
想法1很好。创建一个实用程序方法,将条目记录到数据库中。所以每次你想记录一些事件时,只要调用这个方法即可。不应该占用太多的服务器资源,也不会显著减慢响应时间。
https://stackoverflow.com/questions/15779523
复制相似问题