2014-11-25 84 views
-1

在我的web应用程序中,我们在servlet中执行一些套接字作业,并将套接字数据记录到数据库中。实现异步日志记录的基本模式

我想使该日志记录进程异步以提高性能。

我的想法是使用一个单独的专用线程来执行日志记录工作。在我的servlet中,我只是将数据提交给缓存,并让日志记录线程逐个处理它们。

我在线程方面有一点经验,我可以用作缓存的什么集合?实现这个的基本代码模式是什么?请提供一些代码来说明如何实现这一点。

对不起我的英语不好

我的应用程序是在生产environment.It运行只使用servlet和JSP没有其他Java EE技术的遗留系统。看来添加JMS支持对我来说太贵了。

+0

许多现有的日志框架处理这个相当不错,你有没有考虑使用[log4j的2](http://logging.apache.org/log4j/2.x/)(背后[SLF4J(HTTP:// WWW。 slf4j.org/))?看看他们的[异步记录器](http://logging.apache.org/log4j/2.x/manual/async.html) – kuporific 2014-11-25 00:47:51

+0

@kuporific我知道log4j 2,但我们的领导不会允许这样做。 – CaiNiaoCoder 2014-11-25 00:59:35

回答

0

队列和线程池应该是你在队列good.Publish的消息,让工人线程从队列中挑选信息,并将其保存在数据库中。根据您的要求/负载,您可以调整您的队列和线程池大小。

+0

只是一个java.uti.Queue? – CaiNiaoCoder 2014-11-25 01:02:06

0

如果你正在寻找输出日志到一个文件,你可以尝试在记录器类使用信号量(最好是互斥锁),以防止同时写入/竞态条件。信号量是设计的同步原语,以便程序员可以使用它们来确保在任何时候只能对任何一个数据结构进行一定数量的访问。我不会解释整个概念,但Java在java.util.concurrent.Semaphore类中提供了这些内容。互斥(MUT UAL clusion锁)是一个信号,只允许一个线程是“持有”它在任何给定的时间。试一试!

0

如果你正在寻找使用专用线程来处理记录,你会想实现一个生产者/消费者模式,并使用队列来处理信息对象的存储。生产者/消费者模式主要用于帮助线程同步和通信。下面是生产者/消费者实施的一个示例,可能有所帮助:http://www.tutorialspoint.com/javaexamples/thread_procon.htm

另一种选择是生成标准日志记录操作,然后创建执行此工作的线程池线程。这样做的好处是线程池处理线程的调度以及线程的执行时间,但不利的一面是,由于线程调度程序可以随意选择下一个要运行的线程中的哪个线程,因此无法保证使用此方法进行FIFO记录。

0

除非你的领导者坚持有关重新发明轮子,使用SLF4J的logback用的一个AsyncAppender背后DBAppender。它开箱即用,它像一个魅力。

您应该确实阅读关于logback's appenders

可以找到一个完整的例子here