Kal*_*see 5 java logging multithreading java-ee websphere-7
我正在研究在Websphere 7.0上运行的Java EE 5应用程序,并且我正在尝试找到一种线程安全且高性能的方法来多线程化数据库审计日志记录的持久性. 是否有任何已知的方法可以在Java EE应用程序中安全有效地执行多线程审计日志记录?
如果您需要一些背景信息:该应用程序是一个Web服务,它收到的每个请求消息都会导致创建100或200个审核日志消息,这些消息必须持久保存到数据库中.最初审计日志记录是使用扩展java.util.logging.Handler的自定义审计处理程序类完成的,而publish方法将打开数据库连接,从LogRecord填充预准备语句,然后执行插入.由于此自定义处理程序在EJB的线程内运行,因此审计日志记录可能会为每个请求消息的响应时间增加几秒钟,并导致错过SLA.
因此,审计处理程序被一个包装处理程序替换,该处理程序添加会创建一个单独的线程(是的,使用新的Thread(),而不是Java EE的规则).包装器处理程序使用Vector对审计记录进行排队,并使用审计处理程序在单独的线程中尽可能快地将它们保留.
虽然它破坏了Java EE线程的规则,但是这个包装器运行得很好...... 直到我们允许在MDB上进行并发调用. 当允许多个EJB调用时,包装器可能会搞砸,并且可能会将每个日志记录多次保存到数据库中.这似乎表明包装器或线程创建逻辑有一个bug.
我本来打算找出并解决这个问题,但我想我会先问问是否有更好的方法.
使用 JMS,将这些审核消息放入队列中,然后调用其他一些服务来获取它们并将它们存储在数据库中。当然,这意味着所有日志不一定都实时存储在数据库中,但这种方法将从 Websphere 卸载一些工作,并且您的代码中不会有破坏标准的多线程。
| 归档时间: |
|
| 查看次数: |
1212 次 |
| 最近记录: |