我正在开发在 Websphere 7.0 上运行的 Java EE 5 应用程序,并试图找到一种线程安全且高性能的方法来多线程化数据库审计日志记录的持久性。 是否有任何已知的方法可以在 Java EE 应用程序中安全有效地执行多线程审计日志记录?
如果您需要一些背景信息:该应用程序是一个 Web 服务,它接收到的每条请求消息都会导致创建 100 或 200 条审核日志消息,这些消息必须保存到数据库中。最初,审计日志是使用扩展 java.util.logging.Handler 的自定义审计处理程序类完成的,并且发布方法将打开数据库连接,从 LogRecord 填充准备好的语句,并执行插入。由于此自定义处理程序在 EJB 的线程中运行,因此审核日志记录可能会增加每条请求消息的响应时间几秒钟,并导致错过 SLA。
因此,审计处理程序被替换为添加创建单独线程的包装处理程序(是的,使用 new Thread(),违反了 Java EE 的规则)。包装处理程序使用 Vector 对审计记录进行排队,并使用审计处理程序将它们尽可能快地保存在单独的线程中。
虽然它打破了 Java EE 线程的规则,但这个包装器运行良好……直到我们允许在 MDB 上进行并发调用。 当允许多个 EJB 调用时,包装器可能会出错,并且可能会将每个日志记录多次保存到数据库中。这似乎表明包装器或线程创建逻辑存在错误。
我打算努力识别和解决这个问题,但我想我会先问一下是否有更好的方法。