如何多线程化Java EE数据库审计记录器?

时间:2011-01-03 18:32:28

标签: java multithreading logging java-ee websphere-7

我正在研究在Websphere 7.0上运行的Java EE 5应用程序,并且我正在尝试找到一种线程安全且高性能的方法来多线程化数据库审计日志记录的持久性。 是否有任何已知的方法可以在Java EE应用程序中安全有效地执行多线程审计日志记录?

如果您需要一些背景信息:该应用程序是一个Web服务,它收到的每条请求消息都会导致创建100或200条审核日志消息,这些消息必须持久保存到数据库中。最初,审计日志记录是使用扩展java.util.logging.Handler的自定义审计处理程序类完成的,而publish方法将打开数据库连接,从LogRecord填充预准备语句,然后执行插入。由于此自定义处理程序在EJB的线程内运行,因此审计日志记录可能会为每个请求消息的响应时间增加几秒钟,并导致错过SLA。

因此,审计处理程序被一个包装处理程序替换,该处理程序添加会根据Java EE 的规则创建一个单独的线程(是,使用新的Thread())。包装器处理程序使用Vector对审计记录进行排队,并使用审计处理程序在单独的线程中尽可能快地将它们保留。

虽然它破坏了Java EE线程的规则,但是这个包装器工作得很好...... 直到我们允许在MDB上进行并发调用。当多个EJB调用时,包装器有可能搞砸了是允许的,并且可能会将每个日志记录多次保存到数据库中。这似乎表明包装器或线程创建逻辑有一个错误。

我打算确定并解决这个问题,但我想我会先问问是否有更好的方法。

1 个答案:

答案 0 :(得分:3)

使用JMS,将这些审核消息放在队列中,然后调用一些其他服务来提取它们并将它们存储在数据库中。当然,这意味着所有日志不一定会实时存储在数据库中,但是这种方法将从Websphere中卸载一些工作,并且您的代码中不会有标准的多线程。