gpt4 book ai didi

java - 如何对 Java EE 数据库审计记录器进行多线程处理?

转载 作者:搜寻专家 更新时间:2023-10-31 20:23:40 24 4
gpt4 key购买 nike

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

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

因此,审计处理程序被一个包装处理程序所取代,该处理程序添加了一个单独的线程(是的,使用 new Thread(),违反了 Java EE 的规则)。包装器处理程序使用 Vector 对审计记录进行排队,并使用审计处理程序将它们尽可能快地保存在单独的线程中。

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

我本来打算着手找出并解决这个问题,但我想我会先问问 SO 是否有更好的方法。

最佳答案

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

关于java - 如何对 Java EE 数据库审计记录器进行多线程处理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4587174/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com