2

我有一个我正在重写的 Web 应用程序,它当前执行大量的审计数据 sql 写入。用户交互的每一步都会导致执行一个将一些信息写入数据库的方法。这可能会因数据库问题导致交互停止,从而影响用户。

理想情况下,我想移动这是一种基于消息的方法,如果需要写入数据,它也会被触发一个队列,消费者在其中选择这些并将它们写入数据库。它不是必要的数据,如果服务器出现故障,丢失是可以接受的。

如果我应该尝试使用嵌入式 JMS 队列和代理或 Java 队列,我只是有点困惑。或者我不熟悉的东西(建议?)

最好的方法是什么?

更多信息:该应用程序使用 spring 并在 websphere 6 上运行。所有消息通信都是本地的,它不会与另一台服务器通信。

4

4 回答 4

1

根据您对问题的描述,一个简单的队列就足够了。你可以有一个固定大小的队列,如果它填得太快,你可以丢弃消息,因为你说它们并不重要。

需要考虑的事项:

  • 其他应用程序现在或将来是否也需要此功能。
  • 产生消息的速度是否如此之大,以至于当大量用户登录时它会开始消耗大量堆内存。如果消息不应该丢失,这很重要。
于 2013-03-21T19:10:44.560 回答
1

但是,我不确定这是否是 Java EE 容器中的最佳实践。

由于您已经在 WebSphere 机器上运行,因此您确实有一个 JMS 代理(SIBus)在运行。启动异步操作的最简单方法是发送 JMS 消息并让 MDB 读取它们 - 并进行数据库插入。您可能会遇到一些问题,在 WebSphere 中生成自己的线程仍然可以利用 JNDI 资源的初始上下文。

在非 Java EE 的情况下,我会使用类似普通的 LinkedBlockingQueue 或任何阻塞队列的东西,并且只有一个线程轮询该队列以将新消息插入数据库。

于 2013-03-23T06:28:01.650 回答
1

我认为使用 JMS 进行日志记录是多余的,尤其是如果 loggin 是使用 JMS 的唯一原因。

看看DBAppender,你可以直接登录到数据库。如果您关心性能,您可以使用 Logback 异步记录。

如果您仍想采用 JMS 方式,那么 Logback 具有 JMS队列主题附加程序

于 2013-03-21T06:48:11.393 回答
0

仅当涉及不同的服务器时,我才会使用 JMS 队列。因此,在您的情况下,我将使用带有一些 Java 队列的简单纯 Java 来执行此操作。

于 2013-03-21T06:08:52.040 回答