【问题标题】:JavaEE How to update View after Database ChangeJavaEE如何在数据库更改后更新视图
【发布时间】:2026-01-29 08:25:01
【问题描述】:

在我的企业应用程序中,我试图将 Web 层与 EJB 层分开,并将相应的文件(jar 和 war)部署在两个单独的服务器上。因为我不想为每个访问我的应用程序的用户打开一个数据库会话,所以我有一个支持 bean,它将我的数据库中的数据表示存储在内存中。每次用户访问应用程序时,他只能看到 backing bean 的这些数据。

现在我遇到的问题是,每当对数据库进行更改时,我都必须更新这些数据。到目前为止,我为此使用了 CDI 事件。当进行更改时,EJB 将仅抛出 CDI 事件,并且支持 bean 侦听这些事件并创建数据库会话并更新其内容。

现在我想将 Web 应用程序和 EJB 模块部署在不同的机器上,这可能不再起作用,因为 CDI 事件仅限于同一只耳朵。我已经尝试将我的整个耳朵模块部署到一台服务器上,即使这样,事件也没有被支持 bean 注册,这很奇怪,因为这应该可以正常工作......

所以现在我的问题是:除了使用 JMS 来更新支持 bean 数据之外,还有其他方法吗?我相信这不是一个奇特的用例,但我找不到任何关于如何处理这个问题的信息。

【问题讨论】:

  • 它是只读应用程序吗?否则您描述的方法非常脆弱。

标签: jakarta-ee jsf-2 ejb cdi backing-beans


【解决方案1】:

您没有指定您使用的 Java EE 版本 - 但如果它是 7,那么您手头有 WebSocket API。您将在Oracle WebLogic 12 documentation 中找到一个非基于浏览器的客户端端点与服务器端点对话的示例。

或者,您可以在 Web 应用程序中实现 RESTful Web Service,由您的业务应用程序调用以通知您更新。

【讨论】:

  • 抱歉,我使用的是 JavaEE 6。我考虑过使用由我的 EJB 组件触发的 Servlet。这与您的想法相当,但在我看来,这种方法似乎有点脏..
  • 您可以使用特定于容器的解决方案或替代的 Web 套接字实现。由于没有 WebSockets,您就没有可用的推送,您要么必须轮询更改,要么使用通知机制,如 JMS 或通过上述 Web 服务。