【问题标题】:Deploy an EAR multiple times with different data-sources on the same server在同一台服务器上多次部署具有不同数据源的 EAR
【发布时间】: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


【解决方案1】:

我意识到这个问题有点过时,但只是想指出属性替换功能: https://docs.jboss.org/author/display/WFLY8/Java+EE+Application+Deployment+Configuration

从我读到的内容(没有测试它——尽管在其他情况下这样做了),你应该能够将它应用到你的 persistence.xml。

所以基本上你可以使用 jndi-name 设置一个系统属性,用于给定的应用程序实例,并在你的 persistence.xml 中引用该属性。

意味着您无需开始触摸您的耳朵,同时启用每个客户的特殊性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多