如何对JavaEE数据库审计记录器执行多线程?

如何对JavaEE数据库审计记录器执行多线程?,java,multithreading,logging,jakarta-ee,websphere-7,Java,Multithreading,Logging,Jakarta Ee,Websphere 7,我正在开发一个运行在WebSphere7.0上的JavaEE5应用程序,并试图找到一种线程安全且性能良好的方法来多线程持久化数据库审计日志记录。在JavaEE应用程序中,是否有安全有效地执行多线程审计日志记录的已知方法 如果您需要一些背景信息:该应用程序是一个web服务,它接收的每个请求消息都会创建100或200条审核日志消息,这些消息必须保存到数据库中。最初,审计日志记录是使用扩展java.util.logging.handler的自定义审计处理程序类完成的,发布方法将打开数据库连接,从日志记

我正在开发一个运行在WebSphere7.0上的JavaEE5应用程序,并试图找到一种线程安全且性能良好的方法来多线程持久化数据库审计日志记录。在JavaEE应用程序中,是否有安全有效地执行多线程审计日志记录的已知方法

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

因此,审计处理程序被一个包装处理程序所取代,该包装处理程序添加了一个单独的线程yes,并根据javaee的规则创建了一个新线程。包装器处理程序使用向量将审核记录排队,并使用审核处理程序在单独的线程中尽可能快地将它们持久化

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


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

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

MDB上的并发调用是什么意思?除了使用Spring的MessageListener而不是MDB之外,我们有一个类似的模型。ActivationSpecification有一个Maximum server sessions属性来指定单个ActSpec可以并发处理多少消息。在1之前,每个服务器在给定时间只处理1条消息。当您将该数字增加到>1时,服务器会在给定时间处理多条消息。看起来您正在使用WebSphere MQ。最大服务器会话数似乎是WMQ的自定义属性,而不是MDB。所以我建议你把它发布在MQ论坛上。谢谢,这是个好主意。我想我会尝试一个概念证明,看看它如何处理负载。