我正在处理在WebSphere 7.0上运行的Java EE 5应用程序,并试图找到一种线程安全和性能的方式来多线程数据库审核日志记录的持久性。 是否有任何已知的方法可以在Java EE应用程序中安全有效地执行多线程审核记录?

如果您需要一些背景信息:该应用程序是Web服务,并且它收到的每个请求消息会导致创建100或200个审核日志消息,必须将其持续到数据库。最初,审核记录是通过扩展Java.util.logging.handler的自定义审核处理程序类完成的,并且发布方法将打开数据库连接,填充logrecord的准备好的语句,并执行插入。由于此自定义处理程序在EJB的线程中运行,因此审核日志记录可能比每个请求消息的响应时间多达几秒钟,并导致SLA被遗漏。

因此,审计处理程序被替换为一个包装处理程序,该处理程序添加了创建单独的线程(是的,使用新线程(),违反Java EE的规则)。包装器处理程序使用向量排队审核记录,并使用审核处理程序在单独的线程中尽可能快地将它们持续。

虽然它打破了Java EE线程的规则,但该包装器运行良好... 直到我们允许在MDB上同时进行调用。 当允许多个EJB调用时,包装器有可能拧紧,并且可能会多次将每个日志记录保存到数据库。这似乎表明包装器或线程创建逻辑具有错误。

我打算识别和解决这个问题,但想我首先问,以便有更好的方法。

有帮助吗?

解决方案

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top