2014-11-25 87 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