我正在开发一个运行在Websphere 7.0上的Java 5应用程序,并试图找到一种线程安全和性能良好的方法来多线程数据库审计日志记录的持久性。是否有在Java应用程序中安全有效地执行多线程审计日志记录的已知方法?
如果您需要一些背景信息:该应用程序是一个web服务,它接收到的每个请求消息都会导致创建100或200个审计日志消息,这些消息必须持久化到数据库中。最初,审计日志记录是使用扩展java.util.logging.Handler的自定义审计处理程序类完成的,发布方法将打开数据库连接,从LogRecord填充已准备好的语句,并执行插入。由于这个自定义处理程序是在EJB线程中运行的,因此审计日志记录可能会使每个请求消息的响应时间加起来几秒钟,并导致错过SLA。
因此,审计处理程序被替换为一个包装处理程序,它添加了一个单独的线程(是的,根据Java的规则使用了新的Thread() )。包装器处理程序使用向量对审计记录进行排队,并使用审计处理程序尽可能快地将它们保存在单独的线程中。
虽然它破坏了Java线程的规则,但是这个包装器工作得很好.,直到我们允许在MDB上并发调用。包装器可能会在允许多个EJB调用时出错,并且可能会多次将每个日志记录保存到数据库。这似乎表明包装器或线程创建逻辑有错误。
我本来打算找出并解决这个问题,但我想先问一下是否有更好的方法。
发布于 2011-01-03 22:37:43
使用JMS,将这些审计消息放在队列中,然后调用其他一些服务,将它们收集起来并存储在数据库中。当然,这意味着所有日志不一定会实时存储在数据库中,但是这种方法将从Websphere卸载一些工作,您的代码中也不会有标准的多线程处理。
https://stackoverflow.com/questions/4587174
复制相似问题