【发布时间】:2014-11-05 20:13:08
【问题描述】:
让我们假设一个 Java EE 6 应用程序使用 JPA 打包为 EAR(一个 EJB-JAR、N 个 Web 模块和一些库)以实现持久性。
要求是,需要在一台机器上运行多个客户的应用程序。每个客户都有自己的数据库。
现在的问题是,您在哪里为每个客户配置数据源以及如何告诉应用程序(在部署时或任何时候)使用哪个数据源?
首先: 将persistence.xml 中容器特定的JNDI 名称替换为特定于应用程序的名称。在部署时,特定于应用程序的名称需要绑定到特定于容器的名称。
问题:从我读到的内容中,不可能使用persistence.xml 进行引用,除非您禁用实体的增强从而降低性能,除非我完全误解了立场。 (来源:http://lists.jboss.org/pipermail/wildfly-dev/2014-January/001541.html)
其次,我发现无法在 EAR 级别上进行资源引用,我想必须在 application.xml 中进行,在我的情况下是由 maven 生成的,因此我必须在POM,但是不知道怎么用,EJB插件的参考没有提到。
但也许我只是走错了路。任何帮助将不胜感激。
更新 - 2014-09-12: 从 POM.xml 中删除 application.xml 的自动生成并将 <resource-ref/> 添加到 application.xml,映射数据的本地 JNDI 名称- 容器特定作品的来源。 (这让我非常高兴。)
<resource-ref>
<res-ref-name>jdbc/customer-alpha</res-ref-name>
<res-type>javax.sql.XADataSource</res-type>
<lookup-name>java:jboss/datasources/customer-alpha</lookup-name>
</resource-ref>
我仍然不确定是否真的会这样做。还有一些其他问题,但会单独提出,例如谁将映射添加到 application.xml 以及何时,部署此类应用程序的工作流程是什么。
-
马丁
【问题讨论】:
-
为什么不简单地为每个 Web 应用程序分离 ejb?
-
@pmp 我想我不明白。问题不在于多个 web 模块,它们只是它是 EAR 而没有 WAR 的原因。问题是运行此 EAR 的多个实例,每个实例都有不同的数据源,需要在部署时放入 persistence.xml。
-
所以在这种情况下,定义多个持久单元并且您需要相同数量的会话 bean,以便每个会话 bean 与一个持久单元交互。并在每个 web 模块中注入适当的会话 bean。
-
或者你可以有多个持久单元和一个通用表(一个简单的映射表,它决定了哪个 web 模块应该与什么持久单元交互),它决定了你应该与哪个表交互。每当您需要调用 EntityManager 时,首先查找此通用表并获取适当的实体管理器。
标签: jakarta-ee jpa jndi wildfly